개발/스프링 개념
[Spring] DAO vs DTO vs VO vs Entity
스프링을 공부 하다 보면, 항상 헷갈리는 개념이 있다. 우선적으로 DAO, DTO, VO 이 세가지의 기능이 확실히 구분이 되지 않는데, 이들을 한 번 정리해보고자 한다. 또한, 정리하던 중 Entity에 대한 개념도 설명하시는 포스팅을 많이 확인하여서 이에 대해서도 정리해보겠다. DAO DAO는 Data Access Object로 DB에 접근하기 위한 객체이다. 직접 DB에 접근하여 데이터를 CRUD하기 위한 기능을 수행한다. DB 접근을 위한 로직과 비즈니스 로직을 분리하기 위해 사용되며 요즘은 MyBatis 등의 DB 접근 라이브러리가 존재하기에 별도로 잘 사용을 안한다. ex. public interface UserDao { User findById(int id); void save(User us..
[Spring] Spring JPA FindByFK (외래키로 조회)
스프링 프로젝트 진행 중 외래키를 사용해 DB 내의 정보를 찾아와야 할 경우가 생겼다. FindBy와 외래키를 동시에 사용해본 적이 없어 이에 대해 정리해보고자 한다. 먼저 엔티티 클래스는 다음과 같다. @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Entity @IdClass(ReviewLikeId.class) public class ReviewLike extends BaseTimeEntity implements Serializable { @Id @ManyToOne(targetEntity = Review.class, fetch = FetchType.LAZY) @JoinColumn(name = "reviewId") private Review revie..
[Spring] Spring JPA 복합키
프로젝트 진행 중 아래 그림의 '리뷰 좋아요' 테이블을 위해 외래키들로 이뤄진 복합키를 사용해야하는 상황이 생겼다. review_id는 리뷰 테이블에서 참조하여 받아오는 외래키이고, 마찬가지로 user_id도 사용자 테이블에서 받아오는 외래키이다. 이전에 Spring JPA에서 복합키를 사용해본 적이 없어서 진행하는데 큰 어려움이 있었다. 다음에 또 이런 상황이 발생한다면 시행착오를 줄이고 어려움 없이 진행하기 위해 제대로 정리해보고자 한다. 또한 나처럼 외래키와 복합키를 동시에 사용해야 하는 다른 개발자들에게도 이 글이 도움이 되었으면 좋겠다. 시작하기에 앞서 외래키를 받아올 부모 테이블인 Review 테이블의 코드이다. @Getter @Setter @NoArgsConstructor @Entity pu..
[Spring] Session이란?
'스프링 부트와 AWS로 혼자 구현하는 웹 서비스'를 공부하던 중 궁금한 점이 생겨 이를 정리하고자 한다. 해당 책 5장을 보게 되면 HttpSession에 로그인한 사용자의 정보를 저장하는 아래의 코드가 나오고 httpSession.setAttribute("user", new SessionUser(user)); // 세션에 사용자 정보를 저장하기 위한 Dto 클래스 이를 어노테이션화한 아래의 코드가 나온다. @LoginUser SessionUser user 둘 다 HttpSession을 사용한다. 또한 HttpSession 뿐만 아니라 Spring-Session-JDBC를 사용하여 스프링 세션을 H2 DB에 저장하는 방식 또한 소개된다. 5장에서 다루는 중요한 내용이라고 생각되어서 HttpSession..
[Spring] Select에 @Transaction을 사용하는 이유
'스프링 부트와 AWS로 혼자 구현하는 웹 서비스'를 공부하던 중 궁금한 점이 생겨 이를 정리하고자 한다. @Transactional(readOnly = true) public List findAllDesc(){ return postsRepository.findAllDesc().stream()// postsRepository의 결과로 넘어온 Posts의 stream을 .map(PostsListReponseDto::new) // map을 통해 PostsListResponseDto로 변환하고 .collect(Collectors.toList()); // 이를 List로 반환하는 메소드 } 위의 코드를 보면, DB에서 posts들을 Select하는 메서드이다. 하지만 @Transactional(readOnly ..
[Spring] Spring 웹 계층 구조
스프링에 대해 공부할 때 우리가 항상 배우는 중요한 개념이 바로 스프링의 웹 계층 구조이다. Service, Repository, Controller, Entity, DTO 등이 스프링 웹 계층에 포함되는데 항상 배우면 까먹고를 반복하다 보니 명확하게 알고 가는 것이 필요할 것 같아서 정리해보고자 한다. 스프링 웹 계층을 그림으로 나타내면 다음과 같다. 1. Web Layer 웹 애플리케이션의 최상위에 위치한다. 외부의 요청을 받고 이에 응답하는 영역이며, 다른 레이어에서 발생한 예외도 처리한다. 인증을 관리하고 권한을 받지 못한 사용자에 대한 인증 거부도 진행한다. @Controller와 JSP/Freemarker 등의 뷰 템플릿 영역이다. 필터, 인터셉터, 컨트롤러 어드바이스 등을 포함한다. 데이터 ..
[Spring] 의존성 주입이란?
의존성 주입(Dependency Injection)은 스프링의 핵심 개념 중 하나로 흔히 DI로 줄여 쓰기도 한다. 의존관계 주입이라고 하기도 하고 다양한 번역이 존재하지만 이 글에선 의존성 주입으로 통일하도록 하겠다. 1. 의존성 (Dependency) 의존성 주입에 대해 알기 전에 의존성이 무엇인지 알아봐야 할 필요가 있다. 일단 '의존한다'라는 것은 무엇일까? 흔히 우리가 '철수가 영희에게 의존한다'라는 표현을 하면 철수가 영희에 의해 좌지우지된다고 생각할 수 있다. 즉, 영희의 행동과 상태의 변화가 일어나면 그 영향이 철수에게도 미친다는 것이다. 철수와 영희를 프로그램의 일부로써 생각한다면 영희의 기능 변경이나 추가가 철수에도 영향을 끼친다는 것이다. 의존대상 B가 변하면, 그것이 A에 영향을 미..
[Spring] 영속성 컨텍스트와 @Transactional 어노테이션
들어가기에 앞서 스프링 Todo List 프로젝트 중 JPA의 Dirty Checking 기능이 작동하지 않아 이유에 대해 함께 프로젝트를 진행 중이던 팀원에게 물어보니, @Transactional을 Update Service에 붙이지 않아서 Dirty Check가 이루어지지 않았다는 사실을 알려주었다. 단순히 @Transactional은 오류 발생 시 롤백을 위함으로 알고 있던 나에게는 충격으로 다가왔다. 그렇기에 @Transactional 어노테이션에 대해 제대로 정리를 해야겠다는 생각을 하게 되었다. @Transactional과 영속성 컨텍스트에 대해 알아보기 전에 먼저 JPA의 Dirty Checking 기능에 대해 알아보겠다. JPA Dirty Checking JPA는 Entity Manager..
[Spring] Open-In-View란?
Open-In-View는 Open-Session-In-View 또는 Open-EntityManager-In-View라고 불리기도 한다. Default값은 true이며, 이 경우에는 영속성 컨텍스트가 트랜잭션 범위를 넘어선 레이어까지 살아있다. API에서는 클라이언트에게 응답될 때까지, View에서는 View가 렌더링될 때까지 영속성 컨텍스트가 살아있다. 아래처럼 application.properties에서 false로 설정해주었다면, 영속성 컨텐스트는 트랜잭션을 종료할 때 같이 닫히게 된다. spring.jpa.open-in-view=false 위 그림은 OSIV(Open-Session-In-View)가 True일 때를 보여준다. 위 그림은 OSIV(Open-Session-In-View)가 False일 ..