[UMC server(Spring boot) 7주차] spring 개발 환경 설정 / JPA를 통한 엔티티 설계&매핑, 프로젝트 파일 구조 이해

Sujung Shin·2023년 11월 21일
0

https://start.spring.io/
위의 사이트는 spring 프로젝트를 간단하게 환경설정 후 생성할 수 있는 기능을 제공해준다.


Gradle에 java를 할 것이기 때문에
kotlin이 아닌 Groovy를 선택한 후,
2.7버전에서 스냅샷이 아닌 안정된 버전을 선택해준다.


dependencies 들은 4개를 추가해준다:

Spring Web, Lombok, MySQL Driver, Spring Data JPA

그 다음 generate 버튼을 누르면 해당 zip 파일이 다운로드되면서 뜬다.

zip 파일의 압축을 푼 후,
IntelliJ에서 해당 프로젝트 파일을 열어주면
새로운 프로젝트 파일을 열 수 있다.

이제 SpringBoot 프로젝트로 돌아와서,
IntelliJ에서 필요한 플러그인을 설치한다.


내가 설치한 플러그인은 'Atom Material Icons'이다.
설정 - 플러그인 - 마켓플레이스에서 필요한 플러그인을 검색하여 설치해준다.

SpringBoot의 디렉토리 컨벤션


우선 umc.spring 밑에 동그라미 친 패키지들을 만들어준다.

🗂️ domain 패키지

JPA에서 사용하기 위한 엔티티 클래스를 저장하기 위한 패키지

🗂️ controller 패키지

http 요청이 오면, 그에 대한 응답을 주는 클래스의 모임이다.
응답을 주기 위한 과정들을 service 단에서 처리하게 한다.

🗂️ service 패키지

비즈니스 로직이 필요한 클래스들의 모임이며, 복잡한 코드가 들어간다.
controller에서 service의 메소드를 호출하게 되며,
service는 repository의 메소드를 호출하게 된다.

🗂️ repository 패키지

database와 통신을 하는 계층으로,
해당 프로젝트에서는
Spring Data JPA를 이용하여 만든 repository를 이용한다.

🗂️ dto 패키지

클라이언트가 body에 담아서 보내는 데이터를 받기 위한 클래스,
혹은 Database에서 받아온 데이터를 클라이언트에게 보여주기 위한 클래스이다.

Database에서 받아온 데이터(엔티티)를 그대로 응답으로 주게 되면 문제가 발생한다.
요구사항의 변경이 생겨 Database table의 설계가 바뀌게 되어 엔티티의 변경이 발생했을 때,
엔티티를 그대로 응답으로 줄 경우 Database의 변경사항이 프론트엔드 개발자에게까지 영향을 주게 된다.

이와 같은 설계는 좋지 않으므로,
dto를 통해 응답 데이터를 결정하게 만들어 Database의 변경이 생길 경우 dto만 변경하면 되도록 설계를 해준다.

🗂️ converter 패키지

converter은 데이터 형식 간의 변환을 수행하는 역할이다.
즉, entity to dto를 해야 하는 것이다.

repository에서 받아온 엔티티를 dto로 바꾸는 과정을 수행하는 것이 바로 converter이다.
추가로 entity의 생성 또한 converter가 도맡아 하기도 한다.

converter에서 entity의 생성을 하지 않고, service에서 하는 경우도 있다.

converter에서 엔티티의 생성을 하게 되면, service는 순수하게 비즈니스 로직에만 집중할 수 있게 되어 단일 책임의 원칙(SRP)의 측면에서 더 좋다.

converter에서 entity를 생성하는 것이 좋다.

converter의 사용 위치

1. service에서 dto 생성
service에서 converter을 통해 dto를 controller에게 리턴해주는 것으로,
controller에서는 dto를 그저 응답으로 주기만 해도 되고,

  • 장점: controller에 entity가 노출되지 않아 보안적인 측면에서 도움이 된다.
  • 대규모 프로젝트에 적합

2. controller에서 dto 생성
service에서 entity를 리턴하고,
controller에서 converter을 통하여 dto를 만들어 응답으로 주기도 한다.

  • 장점: service의 함수가 범용성이 커져 유지,보수가 편해진다.
  • 동일한 entity를 필요로 하는 여러 controller, validation을 위한 어노테이션에서 service의 함수를 재사용할 수 있어 코딩하기가 용이하다.

(github action을 위한 디렉토리는 추후에 추가될 예정이다.)

🔑 Entity 매핑

domain 패키지에서 entity를 매핑하는 것에 집중하여보자.

1. DB 준비

  1. RDS 혹은 로컬에서 DB 준비하기
  2. application.yml 설정하기
// 로컬 DB이용(mysql)
spring:
  datasource:
    url: jdbc:mysql://zipdabang-db.claedpluhwyw.ap-northeast-2.rds.amazonaws.com:3306/study
    username: 님들의 rds 루트 유저 이름
    password: 님들의 rds 비밀번호
    driver-class-name: com.mysql.cj.jdbc.Driver
  sql:
    init:
      mode: never
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect
        show_sql: true
        format_sql: true
        use_sql_comments: true
        hbm2ddl:
          auto: update
        default_batch_fetch_size: 1000

2. domain 패키지에서 엔티티 만들기

profile
백문이불여일타

0개의 댓글

관련 채용 정보