Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

채채

SpringBoot 패키지 개념 본문

spring boot

SpringBoot 패키지 개념

HChaeEun 2022. 11. 29. 18:16

SpringBoot는 목적에 따라 패키지를 따로 생성해서 프로젝트를 관리하는데, 패키지의 구조는 2가지로 나뉜다.

1️⃣계층형 패키지 구조

- 계층형으로 패키지를 설계하는 방식

- 장: 전체적인 구조를 빠르게 파악

- 단: 디렉토리에 클래스들이 많이 모임

2️⃣도메인 패키지 구조

- 도메인 단위로 디렉토리 구성

- 장: 관련된 코드들이 응집됨

- 단: 프로젝트에 대한 이해도가 낮을 경우, 전체적인 구조를 파악하기 어려움

패키지 구조 비교 예시

따라서,

 

복잡도가 낮고 제공하는 기능이 적어 하나의 계층에 속하는 클래스 수가 적을 때.

제공하는 기능을 명확한 기준으로 분리하기가 애매할 때.

추후에 모듈별로 분리하게 될 일이 없을 것 같은, 작은 규모의 프로젝트

➡️ 계층형 패키지 구조

 

복잡도가 높고 제공하는 기능이 많아 하나의 계층에 속하는 클래스 수가 많을 때.

제공하는 기능을 명확한 기준으로 분리할 수 있을 때.

추후에 모듈별로 별도의 서비스가 될 가능성이 있을 때.

➡️ 도메인 패키지 구조


✔️패키지 종류와 연동 과정

  • Controller
  • DTO
  • Service
  • Repository
  • Domain (Entity)

의 5가지 패키지로 분류할 수 있고, 각 패키지들은 직접 연동되지 않고 DTO를 통해 연결된다.


Domain

DB 테이블과 직접 Mapping되는 클래스로서 JPA 사용 시, 어노테이션을 이용하여 테이블/ 필드 등을 설정한다. 즉 비즈니스처리를 담당한다.

 

❓Domain과 Client를 직접 연동하지 않고 DTO를 통해 분리하는 이유는❓

Client 쪽과 연결된 부분은 잦은 변경사항이 있음. Domain과 연결되어 자주 변경하게 된다면 여러 클래스에 영향을 미치게 된다. 반면 DTO는 Domain Model을 복사한 형태로, Presentation Logic을 추가한 정도로만 사용한다.

즉, View Layer와 DB Layer를 확실하게 분리하기 위해. DTO를 통해 연동한다.

 

🔹Domain에서 사용하는 어노테이션

  • Entity: JPA가 해당 클래스를 관리, 테이블과 1:1로 맵핑
  • Id: PK 지정
  • Column: 컬럼으로 인식, 필드에 붙임
  • Builder: Builder 패턴을 사용하기 위함

📜Members.java

@Getter
@NoArgsConstructor
@Entity
public class Members {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long num;

    @Column(length = 15, nullable = false)
    private String id;

    @Column(length = 15, nullable = false)
    private String pass;

    @Builder
    public Members(String id, String pass) {
        this.id = id;
        this.pass = pass;
    }
}

Repository

repository는 DB에 접근하는 소스코드를 모아둔 Interface로, JpaRepository<Entity, PK type>을 넣으면 자동으로 DB와 CRUD를 연결할 수 있는 메소드를 생성한다.

 

📜MembersRepository.java

public interface MembersRepository extends JpaRepository<Members, Long> {
}

DTO

DTO(Data Transfer Object)는 "데이터 전송 객체"로, Service나 Controller에서 DB에 접근할 때 사용하는 클래스이다.

 

✔️ Domain과 DTO의 차이점

Domain은 DB 테이블에 대한 정보를 가지고 있는 클래스

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

 

Domain과 마찬가지로 Builder 패턴을 사용할 수 있다.

📜MembersSaveRequestDto.java

@Getter
@NoArgsConstructor
public class MembersSaveRequestDto {
    private String id;
    private String pass;

    @Builder
    public MembersSaveRequestDto(String id, String pass) {
        this.id = id;
        this.pass = pass;
    }

    public Members toEntity(){
        return Members.builder()
                .id(id)
                .pass(pass)
                .build();
    }
}

Controller

Http 요청과 응답을 위한 클래스로서 제일 앞에 있는 Layer라고 볼 수 있으며, Model이 데이터를 어떻게 처리할지 알려주는 역할을 한다.

사용자에 의해 클라이언트가 보낸 데이터가 있으면 모델을 호출하기전에 적절히 가공을 하고 모델을 호출한다. 그런다음 모델이 업무 수행을 완료하면 그결과를 가지고 View(UI)에게 전달하는 역할을 한다.

 

@Controller 어노테이션을 통해 Bean에 등록되고 스프링에서 관리한다.

 

📜IndexController.java

@Controller
public class IndexController {

    @GetMapping("/")
    public String index() {
        return "index";
    }

    @GetMapping("/join")
    public String join() {
        return "join";
    }
}

Service

Repository와 DTO를 통해 DB에 접근하여 CRUD의 각각의 프로세스 관리예외처리 등을 담당한다.

 

✔️ Service와 Controller을 나눈 이유

중복 코드를 발생시켜 모듈화를 통해  

@Service 어노테이션을 붙이면 스프링에서 관리하는 객체가 된다.

 

📜MemberService.java

@RequiredArgsConstructor
@Service
public class MembersService {
    private final MembersRepository membersRepository;

    // 가입 정보를 DB에 저장
    @Transactional
    public Long save(MembersSaveRequestDto requestDto) {
        return membersRepository.save(requestDto.toEntity()).getNum();
    }
}

 

 


참고

https://velog.io/@m1naworld/Spring-Boot-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B5%AC%EC%A1%B0

https://hyeran-story.tistory.com/160

https://magicmk.tistory.com/4

 

추가적으로 보면 좋을 자료

https://velog.io/@jybin96/Controller-Service-Repository-%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C