목차
개요
프로젝트를 진행하다보면 데이터베이스와의 상호작용에서 일시적인 필드를 사용해야 하는 경우가 종종 있다. 이런 경우에 단순한 작업의 경우에는 @Transient 어노테이션을 사용하여 필드를 영속성 컨텍스트에서 제외시킬 수 있다.
이 포스팅에서는 처음에 @Transient 어노테이션을 사용하여 구현하는 원리를 설명한 후, 나중에 Data Transfer Object(DTO)를 사용하여 레이어를 분리하는 방법에 대해 설명하고 그에 따른 장단점을 설명하겠다.
@Transient 어노테이션을 사용한 구현
@Transient 어노테이션은 JPA에서 사용되며, 클래스의 필드를 영속성 컨텍스트에서 제외시켜서 해당 필드는 데이터베이스에 저장되지 않고, 데이터베이스로부터 로드되지도 않게된다.
위의 코드에서는 Building 엔티티의 availableLectureRooms 필드에 @Transient 어노테이션을 사용하여 일시적인 데이터를 저장한다. 이렇게 하면 필드가 데이터베이스에 저장되지 않으며, 오직 Java 객체 내에서만 사용다.
DTO를 사용한 레이어 분리
@Transient어노테이션을 사용하여 entity에 선언해주면 일시적인 필드를 관리할 수 있지만, 이 방식은 코드의 가독성과 유지 보수성이 떨어질 수 있기에 이를 해결하기 위해 DTO를 사용하여 엔티티와 데이터 전송 객체를 분리할 수 있다.
위 코드에서는 BuildingResponseDto 클래스를 사용하여 Building 엔티티와 별도로 일시적인 필드인 availableLectureRooms를 관리하여 Building 엔티티에서 @Transient를 사용하지 않아도 위와 같은 기능구현이 가능해진다.
두 구현 방식의 장단점 (DTO 기준)
장점
- 엔티티와 DTO를 분리하여 서로 다른 레이어에서 처리할 수 있다.
- 코드의 가독성과 유지 보수성이 향상된다.
- 데이터 전송 객체를 사용하여 클라이언트와 서버 간에 추가 정보를 전달할 수 있다.
단점
- 데이터 전송 객체를 관리하려면 추가적인 코드 작성이 필요하다.
- DTO를 사용하면 객체 간 변환 작업이 필요하므로, 성능 상의 소폭의 저하가 발생할 수 있다.
마무리
@Transient 어노테이션과 DTO를 사용한 레이어 분리 모두 일시적인 필드를 관리하기 위한 방법이다.
처음에는 @Transient 어노테이션을 사용하여 일시적인 필드를 구현했었는데 이 방식은 간단하게 일시적인 필드를 관리할 수 있지만, 코드의 가독성과 유지 보수성에 한계가 있다.
따라서 나중에는 DTO를 사용하여 레이어를 분리하는 방법으로 전환하여 코드의 가독성과 유지 보수성을 향상시키고 클라이언트와 서버 간의 데이터 전달을 더욱 명확하게 만들어 주어 이후에 프로젝트 진행에 도움이 되게 하였다.
'Spring' 카테고리의 다른 글
SpringBoot+MySQL(JPA) 회원가입,JWT 로그 구현하기 - (2) (1) | 2023.06.23 |
---|---|
스프링 JPA: 엔티티 필드의 기본값에 대한 고찰 (0) | 2023.06.21 |
SpringFramework 구성요소 (0) | 2023.04.10 |
SpringBoot+MySQL(JPA) 회원가입,JWT 로그인 구현하기 - (1) (0) | 2023.04.10 |
SpringBoot+MySQL(JPA) 회원가입,JWT 로그인 구현하기 - (0) (2) | 2023.04.10 |