Java/공부

SpringBoot 구조 정리

Frankie 2022. 4. 4. 20:26

스프링부트를 공부하면서 스프링부트 프레임워크의 각각 패키지들이 어떤 역할을 하는지 정리하는 글입니다.

 

프로젝트 구조

- 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