개발 기록/도서관 관리 시스템

[Library Management System] 25.08.08 (23일)

dev.jelee 2025. 8. 8. 23:54

[ 작업한 내용 ]

1. 도서 등록 - ISBN 추가

- book 테이블에 ISBN 컬럼 추가.


2. 도서 등록 - 유효성/예외 처리

- 백엔드에서 도서 등록 시 제목, ISBN, 저자, 출판사, 발행일, 위치, 설명 필드에 null 체크하여 예외 던지기.

- 위치(도서가 있는 위치) 중복 체크 기능 추가.

 

=> 도서 등록 시 ISBN을 유니크 처리 하려다가 말았다.

=> 같은 책을 2권 이상 등록할 수 있기 때문에.


3. 도서 등록 -  Data만 따로 다루는 BaseException 추가

- BaseException에는 Data를 따로 다루지 않아서 BaseException(커스텀한 예외)를 상속받는 DataBaseException을 생성하여, 도서 등록 시 도서 위치 중복 체크에서 해당 위치에 도서가 있는 경우 어느 도서가 있는지 data를 출력해야하기 때문에 data 예외만 따로 추가했다.


4. 도서 수정 - 유효성/예외처리

- 백엔드에서 도서 수정 시 제목, ISBN, 저자, 출판사, 발행일, 위치, 설명 필드에 null 체크하여 예외 던지기.

- 도서 수정할 때 해당 도서 위치를 제외하고 중복되는지 체크를 해야하기 때문에 repository 계층에서 existsByLocationAndIdNot(String location, Long id) 메서드를 생성했다.

 

=> Spring Data JPA의 메서드 네이밍 규칙에 따르면 해당 id의 location을 제외하고 중복되는지 체크하는 메서드라고 한다.

=> Spring Data JPA가 메서드 이름을 파싱해서 자동으로 쿼리를 만들어주는 방식.


5. 도서 수정 - Book 엔티티에 update() 메서드 생성

- 도서 업데이트를 하기 위해서 Book 엔티티에 update() 메서드를 생성했다.


6. 도서 등록, 도서 수정 - @Transactional 어노테이션 추가

- 도서 수정할 때 response에는 수정이 정상적으로 되었다고 하였으나 DB에는 수정 내용이 업데이트가 되지 않아서 찾아보니 다음과 같은 이유였다.

 

=> JPA가 변경을 DB에 반영할 트랜잭션 경계가 없으면 반영이 되지 않는다.

=> JPA는 영속 상태(EntityManager가 관리 중인 엔티티)의 필드가 변경되면, 트랜잭션 커밋 시점에 변경을 감지해서 SQL UPDATE를 자동으로 실행한다. 이걸 Dirty Checking(변경 감지)라고 한다.


[ 메모 ]

1. JPA를 이번에 처음 사용하다보니 모르는 부분이 많았다. 특히 null, empty 처리하는 방식이라던가.. 어노테이션으로도 가능하지만 이걸 무분별하게 사용하면 안될 거 같기도하고.. 그렇다고 예외처리하는 거에 익숙하지 않기 때문에 커스텀한 예외를 그대로 사용하고 if문을 사용해서 null과 empty 체크를 해서 예외를 던지는 방식으로 했다. 코드가 많아져서 지저분하기는 하지만 우선 개발을 해야하기 때문에 이대로 진행하기로 했다.

2. 중간중간 이건 이렇게 바꾸면 좋을거 같은데, 이건 이렇게 하는게 좋을 거 같은데.. 라고 생각나는게 있다보니 개발이 지체되는 거 같다. 역시 처음부터 기획을 잘 짜야지 순탄하게 개발이 되는 거 같다.