[ASAC 3기 개발일지] Spring 프레임워크 및 Spring Boot

배규리·2023년 11월 15일
0
post-thumbnail

제어 역전 (IoC, Inversion of Control)

= 객체 생성 및 주입
= 애플리케이션 개발에 필요한 기반을 제공하여, 개발자가 비즈니스 로직 구현에만 집중할 수 있게 하는 것

IoC의 구현 방법 5가지

1. DI⭐: 의존성 주입
2. Service Locator: Service Locator에서 직접 가져와쓰는 것
3. Events: 이벤트 발행(Publisher/Subscriber)
4. Delegates: 위임(실행 결과를 받는 것까지 모두 위임)
5. Template Pattern: 추상 클래스 부분 구현

이 중에서 우리가 앞으로 써야하고 알아야하는 것은 바로 DI!😊😊

DI(Dependency Injection)

Container가 Bean을 직접 주입해주는 것으로 필요 객체들이 생성되어 주입되는 것을 말한다.

과거 Spring에서는 필요 객체들을 개발자가 개발한 뒤, XML을 통해 일일히 Bean으로 등록했었다.
현재 Spring은 XML이 아닌 @Container, @Repository 등의 어노테이션들을 사용하여 Bean으로 등록한다.
=> 현재 방식이 아주아주 훨씬훨씬 편한 거라고 한다!

위와 같이 Bean을 등록한다는 것은

  1. IoC가 Bean들을 수집하고
  2. 필요 객체가 필요할 때 주입해줄 수 있다는 것!

DI를 구현하기 위한 방법에는 크게 3가지가 있다.

  1. 생성자 주입⭐⭐⭐
    그냥 이걸 사용하면 된다.
    해당 방식에 장점은 먼저
    1) 순환 참조를 컴파일하는 즉시 방지할 수 있다는 점,
    2) Final 적용이 가능하여 Bean객체의 불변성을 보장한다는 점이 있다.
// 생성자 2. 실제 현업에서 사용하는 코드
@RequiredArgConstructor
class MyClass {
	private final MyService service;

	public void test() {
		service.test()
	}
}
  1. 필드 주입
class MyClass {
	@Autowired
	private MyService service;

	public void test() {
		service.test()
	}
}
  1. 수정자 주입(Setter 주입)
class MyClass {
	private MyService service;

	@Autowired
	public void setService(MyService service) {
		this.service = service;
	}
}

Library와 Framework의 차이

  • Library: 개발자는 필요한 Library들을 선택하고, 연결하고, 설정하는 모든 걸 다 직접 해야 한다.
  • Framework: 개발자가 직접 구현한 것 혹은 Library들을 연결하고, 설정하는 것들을 제공

Spring 프레임워크는 Frameworkd의 제어 역전(IoC, Inversion of Control)

  • Library 혹은 구현체의 연결과 설정 및 객체 생성 및 주입 제공

Spring Boot

의존성 관리

모든 의존성 신경쓰지 않고, 버전 충돌없이 잘 말아놓은 최상위 패키지 사용

대표적으로 아래와 같은 친구들이 있다.
build.gradle에 가면 이 친구들을 거의 항상 볼 예정

  • spring-boot-starter-web
    • WAS 개발을 위한 모든 것 = Tomcat 내장 및 '자동 설정' 기능
  • spring-boot-starter-security
    • Spring Security 및 인증, 인가, 권한 라이브러리
  • spring-boot-starter-jdbc
    • HikariCP 커넥션 풀을 활용한 JDBC 기능 제공
  • spring-boot-starter-date-jpa
    • Spring JPA 및 Hibernate 등...

자동 설정(Auto Configuration)

먼저 Configuration이란 Spring의 Bean을 등록하는 JAVA 설정 파일을 말한다.

의존성 관리에서 꽤 많은 라이브러리들을 내포하게 되는데, 이 모든 것에 대한 설정이 문제

스프링 부트에서는 @EnableAutoConfiguration 또는 @SpringBootApplication 중 하나만 사용하면 자동 환경설정이 가능하다.

각 애노테이션들중 대부분은 또 다른 애노테이션들을 포함하는 경우가 있다.
아래는 @SpringBootApplication의 내부 모습이다.

// @SpringBootApplication
@SpringBootConfiguration
@ComponentScan
@EnableAutoConfiguration
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

즉 @SpringBootApplication은
@SpringBootConfiguration, @ComponentScan, @EnableAutoConfiguration을 포함하고 있는 것이다.

이것 자체로는 Spring Boot에 필요한 모든 것을 세팅 그리고 기본 설정하는 역할을 한다고 볼 수 있다!👍👍
이 3개의 애노테이션은 각각 아래와 같은 역할을 갖고 있다.

  • @SpringBootConfiguration
    • 스프링부트 설정을 나타내는 어노테이션이다.
    • 스프링의 @Configuration을 대체한다.
  • @ComponentScan
    • backPackages 프로퍼티 값에 별도의 경로를 설정하지 않으면 해당 어노테이션이 위치한 패키지가 루트 경로가 된다.
    • 하위 루트까지 쭉 이동하면서 Bean을 등록한다.
    • @Component가 붙어있는 클래스를 찾아가서 모든 인스턴스를 생성해 빈으로 등록한다.
  • @EnableAutoConfiguration
    • 미리 정의된 Bean을 가져와서 등록해준다.
    • 미리 정의된 Bean들은 외부 라이브러리 중 spring-boot-autoconfigure에 META-INF 디렉토리 하위의 spring.factories에 자동으로 가져올 Bean들이 등록되어 있다.

Spring과 SpringBoot의 차이

  • Spring
    • WAR(Web Application Archive) 생성
    • 외장 톰캣 필요
      -> Servlet Container에 배치할 수 있는 웹 애플리케이션 압축 포맷
  • Spring Boot
    • JAR(Java Archive) 생성
    • 내장 톰캣 정의
      -> 언제 어디서나 같은 환경에서 스프링 부트 배포
      -> WAS 서버를 구동시킴과 동시에 어플리케이션을 배포한다.
      -> WAR과 달리 단일 Tomcat 서버에는 하나의 어플리케이션만 구동될 수 있다.

Spring MVC와 3-Layered Architecture

Spring의 동작 과정 내부 구조는 다음과 같이 2가지로 분류하여 볼 수 있다.

  • MVC Architecture
  • 3계층 Architecture

둘은 Spring의 구조를 표현하는 방식들이다!
대부분 MVC Architecture 패턴으로 설명한다고 하니 위에껄 더 주의깊게 보자!!⭐⭐

MVC Architecture 패턴: Front Controller+Controller⭐⭐

Tomcat=WAS+Servlet Container

1. Tomcat이 인스턴스에서 처음 구동 시 2개의 Container 생성
a. Servlet Container
b. Spring Container
- Web Application Context
ex) @Container
- Root Web Application Context
ex) @Service, @Repository, @Component

2. 클라이언트로부터 요청이 들어오면 WAS(Tomcat)이 받아 정적 컨텐츠 검색

3. 정적 컨텐츠가 없다면, Servlet Container가 요청을 받아 Servlet 생성

4. DispatchServlet은 아래의 절차대로 요청 처리

  1. 가장 먼저 HandlerMapping을 통해 URL에 매핑된 Controller 찾기
  2. Controller찾으면 수행할 HandlerAdaptor에 실행 위임
  3. HandlerAdaptor는 넘겨받은 Controller 수행 후 Model&View 반환
  4. ViewResolver에서 View에 해당되는 Name 검색
  5. ViewResolver는 최종적으로 View를 만들어 반환

3계층 Architecture 패턴

관심사의 분리(Seperation of Concern)
-> 높은 유지 보수성과 쉬운 테스트

  1. Presentation Layer: 클라이언트 요청에 따른 결과/화면 반환
    a. Controller: 요청 시, 반환 시 데이터 변환 및 처리
    b. View: 반환 시 어떤 페이지를 어떻게 만들어 반환할 것인지 처리

  2. Business Layer: 비즈니스 로직 수행(여러 DB 데이터들을 조합)

  3. Data Access Layer: 애플리케이션 영속성 유지 및 CRUD

    • Repository
      - DAO: DB에 직결된 CRUD 함수
      - Repository: Encapsulating DAO = 필요한 함수만 정의

위의 이미지에서 사용되는 DTO!
개발할 때 파일 제일 많이 만들어지는 이것...
DTO란?🤔

  • 데이터를 담은 객체, 다양한 메서드를 가졌다기보단 Getter, Setter 기능만..!
  • 아래와 같은 상황에 사용한다.
    • 특정 Service 객체가 Controller한테 값의 집합을 넘겨줄 때
    • Controller도 최종 유저에게 보내줄 데이터를 넘겨줄 때
  • DTO에서 Setter를 빼면 VO(불변객체)

그렇다면 VO는 무엇인가!
VO(Value Object)란?🤔

  • DTO에서 Setter 메소드를 빼면 VO!!
  • DTO에 불변성을 더해주기 위한 객체

정리하면 DTO는 가변 객체, VO는 불변 객체이다!

Spring 뭔가 단순하면서도 복잡하다.
들어가면 갈 수록 하나씩 나오는...
MVC 구조에 대해서는 조금 더 깊게 알아봐도 좋을 것같다!

참고 문헌
https://velog.io/@dsunni/Spring-Boot-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%9B%90%EB%A6%AC-%EC%9D%98%EC%A1%B4%EC%84%B1-%EA%B4%80%EB%A6%AC-%EC%9E%90%EB%8F%99-%EC%84%A4%EC%A0%95

profile
백엔드 개발은 취미인 AI 개발자🥹

0개의 댓글