본문 바로가기

Spring Boot

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

📌 소스 작성을 위한 프로젝트 구조

Spring Boot는 목적에 따라 여러 패키지를 생성하여 코드를 관리하고 있어 크게 5가지로 나누어 보면 다음과 같다.
  • controller
  • repository
  • dto
  • domain (entity)
  • service

📌 controller

  • HTTP 요청과 응답을 위한 클래스
  • @Controller 어노테이션을 붙여주면 스프링 빈에 등록되고 스프링에서 관리하는 객체가 된다.
  • @GetMapping(“주소”) 와 같이 http 메서드 명과 함께 주소를 작성해주게 되면 해당 주소로 요청을 받을 수 있게 됩니다.
  • Service를 사용하여 db에 접근하게 되고 model을 사용하여 파라미터를 view 단으로 넘길 수 있고 template 이름만 문자열로 반환하게 되면 View Resolver가 자동으로 해당 template를 찾아 사용자에게 페이지를 보여주게 됩니다.

📌 repository

  • repository는 db에 접근하는 코드를 모아둔 Interface이다.
  • JPA를 사용하면 JpaRepository 인터페이스를 상속받아 제네릭을 통해 관리하고자 하는 클래스, ID필드 타입을 <Posts, Long>와 같이 넣어주게 되면 자동으로 db와 CRUD 연결을 할 수 있는 메서드를 생성해 준다.
  • Create, Update, Delete와 같은 경우에는 다른 테이블 간의 조인을 잘 수행하지 않기 때문에 그대로 사용 하지만 Read와 같은 경우엔 여러 테이블과 조인 연산이 필요한 경우가 많이 때문에 @Query 어노테이션으로 직접 쿼리를 작성하여 사용하거나 querydsl과 같은 동적 쿼리를 생성해주는 라이브러리를 같이 사용하게 됩니다.

📌 dto

  • DTO는 Data Transfer Object로 말 그대로 데이터 전송 객체이다.
  • Service나 Controller에서 DB에 접근할 때 사용하는 클래스입니다.
  • 위에서 설명한 Domain 클래스와 다른 게 무엇인지 의문을 품을 수 있는데 domain은 DB 테이블에 대한 정보를 가지고 있는 클래스이고 dto는 해당 테이블에서 실제로 CRUD를 할 필드를 정의해둔 것이라고 보면 된다.
  • domain과 dto를 나누어서 사용하는 이유는 코드 작성 중에 db에 접근할 필드의 변경이 생겼을 때 domain을 변경하여 db에 접근하는 경우 db 테이블 설정을 직접 접근하는 상황이 발생하여 문제를 일으킬 수 있다.
  • 그로 인하여 테이블에 대한 정보를 작성하는 domain 클래스와 db에 접근하는 필드에 관한 클래스를 작성하는 DTO 클래스를 따로 구현한다.
  • view에서 controller로 넘어오는 데이터를 담거나, controller에서 service로 넘기는 데이터를 담거나 할 때 사용할 수 있다. 로직을 가지지 않고, 데이터 객체에 대한 정보만 담고 있다.

📌 domain (entity 클래스)

  • 실제 db의 테이블과 직접적으로 mapping 되는 클래스
  • jpa 사용 시 여러 Annotation을 사용하여 테이블, 필드, 필드 옵션 등을 설정한다.

📌 service

  • Repository와 DTO를 통해 db에 접근하여 CRUD의 각각의 프로세스 관리와 에러 처리 등을 담당하는 역할을 한다.
  • @Service 어노테이션을 붙여주게 되면 스프링 빈에 등록되고 스프링에서 관리하는 객체가 됩니다.
  • db와 실제적인 접근을 명령하는 소스코드를 작성하는 클래스입니다.
  • DTO에 작성된 메서드를 기반으로 소스코드를 작성하게 됩니다.