꼬마 개발자 탱구

차근차근 확실하게

Framework/Spring

[Spring Boot] 패키지 구조 및 정리

나눈 탱구 2023. 5. 15. 18:11

Spring Boot는 목적에 따라 여러 패키지를 생성하여 코드를 관리하고있다.

  • controller
  • repository
  • dto
  • domain (entity)
  • service

 


📌 domain (entity)

DB 테이블과 직접 mapping 되는 클래스

jpa 사용 시 여러 어노테이션을 사용하여 테이블, 필드, 필드 옵션 등을 설정한다.

domain 과 client를 직접 연동하지않고 dto를 두어 분리하는 이유

  • Client 쪽과 연결된 부분은 잦은 변경 사항이 있을 수 있는데, Domain과 연결되어 자주 변경되게 된다면, 여러 클래스에 영향을 미치기 때문에 분리 한다.
  • DTO는 Domain Model을 복사한 형태로 다양한 Presentation Logic을 추가한 정도로 사용하며 Domain Model 객체는 Persistent 만을 위해서 사용한다.
  • View 단과 DB 단을 확실하게 분리하기 위해

 

📌 controller

HTTP 요청과 응답을 위한 클래스

@Controller 어노테이션을 붙여주면 스프링 빈에 등록되고, 스프링에서 관리하는 객체가 된다.

@GetMapping("주소") 와 같이 http 메서드 명과 함께 주소를 작성해주게 되면, 해당 주소로 요청을 받을 수 있게 된다.

Service를 사용하여 db에 접근하게 되고, model을 사용하여 파라미터를 view 단으로 넘길수 있고, template 이름만 문자열로 반환하게 되면 View Resolver가 자동으로 해당 template를 찾아 사용자에게 페이지를 보여주게 된다.

 

📌 repository

db에 접근하는 코드를 모아 둔 Interface

JPA를 사용하면 JpaRepository 인터페이스를 상속받아 제네릭을 통해 관리하고자 하는 클래스, ID필드 타입을 <Posts, Long> 와 같이 넣어주게 되면 자동으로 db와 CRUD 연결을 할 수 있는 메서드를 생성해 준다.

Creat, Update, Delete와 같은 경우에는 다른 테이블 간의 조인을 잘 수행하지 않기때문에 그대로 사용하지만, Read와 같은 경우엔 여ㅓㄹ 테이블과 조인 연산이 필요한 경우가 많기 때문에 @Query 어노테이션으로 직접 쿼리를 작성하여 사용하거나 qureydsl과 같은 동적 쿼리를 생성해주는 라이브러리를 같이 사용하게 된다.

📌 dto (data transfer object = 데이터 전송 객체)

Service나 Controller에서 DB에 접근할 때 사용하는 클래스

해당 테이블에서 실제로 CRUD를 할 필드를 정의해 둔것

domain과 dto를 나누어 사용하는 이유는 코드 작성 중에 db에 접근 할 필드의 변경이 생겼을때, domain을 변경하여 db에 접근하는 경우 db 테이블 설정을 직접 접근하는 상황이 발생하여 문제를 일으킬 수 있기때문

이때문에 테이블에 대한 정보를 작성하는 domain 클래스와 db에 접근하는 필드에 관한 클래스를 작성하는 DTO 클래스를 따로 구현한다.

view에서 controller 로 넘어오는 데이터를 담거나, controller에서 service로 넘기는 데이터를 담거나 할때 사용할수있다.

로직을 가지지 않고, 데이터 객체에 대한 정보만 담고있다.

 

 

 

📌 service

Repository와 DTO를 통해 db에 접근하여 CRUD의 각각의 프로세스 관리와 에러 처리 등을 담당하는 역할을 한다.

@Service 어노테이션을 붙여주게 되면 스프링 빈에 등록되고 스프링에서 관리하는 객체가 된다.

db와 실제적인 접근을 명령하는 소스코드를 작성하는 클래스 이다.

DTO에 작성된 메서드를 기반으로 소스코드를 작성하게 된다.