김민주

[Spring Master] 입문 이론 - 3 Layer Architecture, IoC와 DI, Bean 본문

STUDY/이론

[Spring Master] 입문 이론 - 3 Layer Architecture, IoC와 DI, Bean

7alswn 2024. 11. 24. 20:29

* http://localhost:8080은 자동으로 /static/index.html 경로를 반환합니다.

DTO

DTO / 출처: Spring Master 1주차

Data Transfer Object, DTO는 데이터 전송 및 이동을 위해 생성되는 객체입니다.

Client에서 보내오는 데이터를 객체로 처리할 때 사용되며, 서버의 계층 간 이동에 사용됩니다. 또한, DB와의 소통을 담당하는 Java 클래스를 그대로 Client에 반환하는 것이 아니라, DTO로 한 번 변환한 후, 반환할 때도 사용됩니다.

3 Layer Architecture

Controller 클래스 하나로 모든 API를 처리하면 양이 많아지고 수정이 어렵다는 한계가 있습니다.

따라서 서버에서의 처리 과정을 크게 Controller, Service, Repository 즉, 3계층으로 분리합니다.

3계층 구조 / 출처: Spring Master 2주차

  1. Controller: Client의 요청을 받고, 로직 처리는 Service에 전달하며 Service에서 처리 완료된 결과를 Client에게 응답합니다.
  2. Service: Client 요구사항을 처리하는 실세 중 실세입니다. 비즈니스 로직을 담당하기에 현업에서는 서비스 코드가 계속 비대해지고 있습니다. DB 저장 및 조회가 필요할 때는 Repository에게 요청합니다.
  3. Repository: DB CRUD 작업을 처리합니다.

IoC(제어의 역전), DI(의존성 주입)

IoC, DI는 객체지향의 SOLID 원칙과 GoF 디자인 패턴과 같은 '설계 원칙' 및 '디자인 패턴'입니다.

출처: https://docs.spring.io/spring-framework/reference/core/beans/introduction.html

Spring Docs에서는 'IoC는 DI로도 알려져 있다'라고 합니다. 즉, DI(의존성 주입) 디자인 패턴을 사용해 IoC(제어의 역전) 설계 원칙을 구현하고 있다고 이해할 수 있습니다.

  • 의존성: 강하게 결합된 코드를 Interface 다형성 원리를 사용해 약한 결합 및 약한 의존성으로 바꿀 수 있습니다.
  • 주입: 필요로 하는 객체를 해당 객체에 전달합니다.
    • 필드에 직접 주입
    • 메서드를 통한 주입
    • 생성자를 통한 주입 - 추천! (객체의 불변성을 지켜줄 수 있습니다.)
  • 제어의 역전: 강한 결합의 코드는 새로운 객체를 만들 때 코드 변경이 불가피했으나, 의존성 주입을 통해 코드 변경 없이도 다양한 객체를 사용할 수 있게 되었습니다. 즉, 제어의 흐름이 역전된 것입니다.

IoC Container와 Bean

DI(의존성 주입)를 사용하기 위해서는 '객체 생성'이 우선되어야 합니다. 이때 Spring에서는 Spring 프레임워크가 필요한 객체를 생성하고 관리하는 역할을 대신 해줍니다.

  • Bean(빈): Spring이 관리하는 객체
  • Spring IoC Container: 'Bean'을 모아둔 컨테이너

Spring 'Bean' 등록 방법

  • @Component: Bean으로 등록하고자 하는 클래스 위에 설정합니다.

Spring 'Bean' 사용 방법

  • @Autowired: Bean을 주입하고자 하는 필드나 메서드 위에 설정합니다.
    • @Autowired 생략 조건
      1. 생성자 선언이 1개일 때는 생략 가능합니다.
      2. @RequiredArgsConstructor 사용 시 final로 선언된 멤버 변수를 파라미터로 사용하여 생성자를 자동으로 생성하기 때문에 @Autowired 대신 사용이 가능합니다.

3 Layer Annotation

  • Spring 3 Layer Annotation은 Controller, Service, Repository의 역할로 구분된 클래스들을 ‘Bean’으로 등록할 때 해당 ‘Bean’ 클래스의 역할을 명시하기위해 사용됩니다.
    1. @Controller, @RestController
    2. @Service
    3. @Repository
  • Spring 3 Layer Annotation은 모두 @Component가 추가되어 있습니다.

[ 정리 ]

SpringFramework가 주입이 되는 객체(클래스)를 @Component를 달면 Bean 객체로 IoC Container에 등록을 해서 갖고 있다가 의존성 주입(DI)이 필요할 때 @Autowired를 달아서 주입을 해줍니다. (@RequiredArgsConstructor로도 주입이 가능합니다.) 생성자를 통한 주입 시 생성자가 하나만 있을 경우에는 @Autowired 생략이 가능합니다.