스프링부트를 공부하면서 스프링부트 프레임워크의 각각 패키지들이 어떤 역할을 하는지 정리하는 글입니다.
프로젝트 구조
- domain
- repository
- dto
- service
- controller
Domain
- db의 테이블과 직접적으로 매핑되는 클래스
- jpa 사용 시 여러 어노테이션을 사용해서 테이블, 필드, 필드 옵션 등을 설정
- 자주 사용되는 어노테이션
- @Entity: 테이블과 1:1로 매핑되는 어노테이션. 해당 어노테이션을 붙이면 jpa가 해당 클래스를 관리
- @Column: 필드에 붙이는 어노테이션. 해당 어노테이션을 붙이면 컬럼으로 인식
- @Id - pk를 지정하는 어노테이션
- @GeneratedValue - pk가 중복되는 것을 방지하기 위해 작성하는 어노테이션
- @Builder - Builder 패턴을 사용하기 위한 어노테이션
(@Builder 어노테이션을 사용하게 되면 객체를 생성할 때 생성자를 통해서 객체를 생성하는게 아니라
도메인.builder().필드(값).필드(값).build(); 를 통해 필드에 대한 값을 좀 더 명시적으로 넣어줄 수 있음.)
Repository
- db에 접근하는 소스코드를 모아둔 interface
- jpa를 사용하게 되면 JpaRepository 인터페이스를 상속받아 제너릭을 통해 관리하고자 하는 클래스, ID 필드 타입을 <Posts, Long>와 같이 넣어주면 자동으로 db와 CRUD 연결을 할 수 있는 메소드를 생성
- 다만 Read는 여러 테이블과 조인 연산이 필요한 경우가 많이 있어서 @Query 어노테이션으로 직접 쿼리를 작성하여 사용하거나 querydsl과 같은 동적쿼리를 생성해주는 라이브러리를 같이 사용.
DTO
- Data Transfer Object의 약자로 데이터 전송 객체이다.
- Service나 Controller에서 db에 접근할 때 사용하는 클래스
- Domain은 db 테이블에 대한 정보를 가지고 있는 클래스고 DTO는 해당 테이블에서 실제로 CRUD 할 필드를 정의해둔 것
-> 테이블을 나누어서 사용하는 이유는 소스 코드 작성중에 db에 접근할 필드의 변경 사항이 생겼을 경우 Domain을 변경하여 db에 접근하는 경우 db 테이블 설정을 접근하는 경우가 되어 큰 문제를 일으킬 수 있기 때문이다.
- Domain과 마찬가지로 Builder 패턴을 사용할 수 있다.
Service
- Repository와 DTO를 통해 db에 접근하여 CRUD의 각각의 프로세스 관리와 에러 처리 등을 담당
- @Service 어노테이션을 붙여주면 스프링 빈에 등록되고 스프링에서 관리하는 객체가 된다.
- db와 실제적인 접근을 명령하는 소스 코드를 작성하는 클래스
- DTO에 작성된 메소드를 기반으로 소스 코드 작성
Controller
- 제일 앞 단에서 http 요청과 응답을 위한 클래스
- @Controller 어노테이션을 붙여주면 스프링 빈에 등록되고 스프링에서 관리하는 객체가 된다.
- @GetMapping("주소")와 같이 http 메소드 명과 함께 주소를 작성해주면 해당 주소로 요청을 받을 수 있게 된다.
- Service를 사용하여 db에 접근하게 되고 model을 사용하여 파라미터를 view단으로 넘길 수 있고 template 이름만 문자열로 반환하게 되면 view resolver가 자동으로 해당 template를 찾아 사용자에게 페이지를 보여주게 된다.
정리
- 스프링은 Domain - Repository - DTO - Service - Controller 구조로 되어 있으며 소스를 작성하는 순서도 이와 같다.
- Domain에서 db와 관련된 클래스를 작성하고 Repository로 Domain에 작성된 필드 접근을 위한 CRUD를 spring-data-jpa를 통해 자동으로 생성하고 DTO로 어떤 테이블에 어떤 필드로 접근할 지 정의.
- 그리고 Service에서 외부에서 해당 기능을 사용할 수 있도록 메소드를 정의하고 외부에서 요청이 오면 Controller를 통해 Service로 디비에 접근하여 요청을 처리
'Java > 공부' 카테고리의 다른 글
백엔드 개발자 자바, 스프링 질문 완전정복 (0) | 2022.09.12 |
---|---|
자바 공부 (0) | 2022.09.12 |
[디자인 패턴] 팩토리 메소드 패턴 (0) | 2022.06.16 |