[스프링부트- blogV1] 2. Spring Framework의 레이어

silver's avatar
Dec 30, 2024
[스프링부트- blogV1] 2. Spring Framework의 레이어
 

1. 레이어구조

Client → Controller → Service → Repository → Database

  • Controller - 클라이언트로부터 요청을 받고 응답을 전달하는 역할. Service에 의존
  • Service - 비즈니스 로직을 처리하는 역할 (트랜젝션-하나로 관리가 중요). Repository에 의존
  • Repository - 데이터베이스와 상호작용하는 역할(DAO- Data Access Object). EntityManager에 의존.

2. Controller

클라이언트와 직접 통신하는 유일한 레이어로 요청,응답을 Service 레이어 에 위임해 비즈니스 로직을 처리한다. 예시) 사용자가 게시글을 조회하거나 작성할 때, BoardController가 이 요청을 받아들인다.

3. Service

  1. 비즈니스 로직처리 클라이언트의 요청을 기반으로데이터베이스 모델과 DTO 간의 매핑을 하여 비즈니스 로직을 처리한다. 이러한 로직은 대개 트랜젝션 내에서 수행된다.
  1. DTO (Data Transfer Object) 변환 처리 서비스 레이어에서는 데이터를 전달할 때 DTO를 사용하여 데이터의 구조를 정의한다.
    1. DTO
      DTO는 데이터 전송을 위한 객체로, 클라이언트와 서버 간의 데이터 전송을 용이하게 한다.요청과 응답 시, MIME 타입을 통해 데이터의 형식을 정의한다.
      MIME (Content-Type)
      MIME 타입은 클라이언트와 서버 간에 주고받는 데이터의 형식을 정의! 클라이언트(*여기서는 브라우저나 어플리케이션)와 서버 간 데이터 전송 시 Content-Type 헤더를 통해 미리 정의된 MIME 타입으로 데이터를 주고받는다. *꼭 알아둬야할 MIME
      1. text/plain: 일반적인 텍스트
      1. text/html: HTML 형식
      1. application/x-www-form-urlencoded 예시) from=1&balance=2000&to=2(key=value&key=value&…)
      1. application/json: JSON 예시)
        1. // JSON형식의 데이터 예시 { "from": 1, "balance": 2000, "to": 2 }
          // DTO 클래스 예시 class DTO { private int from; private int balance; private int to; }
 

4. Repository

Repository는 데이터베이스와의 상호작용을 담당하는 DAO(Data Access Object)이다. 엔티티 모델을 사용하여 데이터베이스와 연결되고 CRUD(Create, Read, Update, Delete) 작업을 수행한다. 스프링의 *IoC(제어의 역전) 컨테이너에 의해 관리된다.
 

5. IoC와 Dependency Injection

  • IoC (Inversion of Control) - 제어의 역전 : 스프링에서는 객체의 생성과 관리 제어를 개발자가 아닌 스프링 컨테이너가 담당한다. 개발자는 new 키워드를 사용하여 객체를 생성하지 않고, 스프링 컨테이너에서 필요한 객체를 자동으로 가져와 사용할 수 있다. 이를 통해 코드의 유연성과 테스트 편의성이 증가한다.
  • DI (Dependency Injection) - 의존성 주입
    • : 각각의 레이어는 IoC 컨테이너에서 필요한 객체를 자동으로 주입받는다.
      Controller ← Service ← Repository ( DI 흐름)
      Controller에서 Service를 주입받고, Service에서 Repository를 주입받아 의존성을 자동으로 해결한다. 이를 통해 코드의 결합도를 낮추고 코드의 재사용성과 테스트 편의성을 높여 유지보수가 쉬워지게 도와준다.
 
 
🙋기본 생성자와 매개변수가 있는 생성자를 둘 다 생성하면 어떤 생성자가 실행이 될까?
→ 기본 생성자가 실행이 된다.
notion image
boardService = null → dependency injection이 안됐음
* final이 붙은 전역변수는 객체가 new될 때 반드시 초기화 되어야 한다.!!!! → 꼭 값을 넣어야 하기 때문에 실수하지 않기 위해 final을 붙인다. final 붙으면 값 변경 불가능 (= read only)
 
 
 
Share article

silver