상세 컨텐츠

본문 제목

[스프링 3팀] 01-02 스프링 부트&개발 전 기초 지식

23-24/Spring 3

by recoday 2023. 10. 13. 10:00

본문

728x90

스프링 프레임워크

  • 자바에서 가장 많이 사용하는 프레임 워크
  • 자바로 애플리케이션을 개발하는 데 필요한 기능을 제공하고 쉽게 사용할 수 있도록 돕는 도구

제어역전

제어역전(IoC: Inversion of Control)

    • 제어역전을 특징으로 하는 스프링은 기존 자바 개발 방식과 다르게 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부(=스프링 컨테이너 or IoC 컨테이너)에 위임함
    • 제어역전을 통해 의존성 주입(DI: Dependency Injection), 관점 지향 프로그래밍(AOP: Aspect-Oriented Programming) 등이 가능해짐

의존성 주입(DI)

의존성 주입(DI): 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식

 

의존성 주입받는 방법

1. 생성자를 통한 의존성 주입

@RestController
public class DIController {
    
    MyService myService;

    @Autowired
    public DIController(MyService myService){
        this.myService=myService;
    }

    @GetMapping("/di/hello")
    public String getHello(){
        return myService.getHello();
    }
}

2. 필드 객체 선언을 통한 의존성 주입

@RestController
public class FieldInjectionController {
    
    @Autowired
    private MyService myService;
}

3. Setter 메서드를 통한 의존성 주입

@RestController
public class SetterInjectionController {
    
    MyService myService;
    
    @Autowired
    public void setMyService(MyService myService){
        this.myService=myService;
    }
}

-> @Autowired라는 어노테이션(annotation) 통해 의존성 주입할 수 있음

 

관점 지향 프로그래밍(AOP)

관점 지향 프로그래밍(AOP)

:Aspect-Oriented Programming

  • 관점을 기준으로 묶어 개발하는 방식
  • 객체지향 프로그래밍(OOP)와 혼동하지 않도록 주의

AOP 구현하는 방법

1. 컴파일 과정에 삽입하는 방식

2. 바이트코드를 메모리에 로드하는 과정에 삽입하는 방식

3. 프락시 패턴을 이용한 방식

 

스프링 프레임워크 vs. 스프링 부트

스프링 프레임워크를 이용하려면 설정이 복잡 -> 이런 문제를 해결하기 위해 스프링 부트(Spring Boot)가 등장

스프링 부트의 특징

1. 의존성 관리  

  • 'spring-boot-starter'라는 의존성을 제공해주기 때문에 별도로 의존성 설정을 하지 않아도 됨

2. 자동설정

  • 스프링부트의 메인 애플리케이션 코드
@SpringBootApplication
public class SpringBootApplication {
    
    public static void main(String[] args){
        SpringApplication.run(SpringBootApplication.class, args);
    }
}
    • @SpringBootApplication은 @SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan 이 세 개의 어노테이션을 합쳐놓은 구성이다             

3. 내장 WAS

  • 스프링 부트의 각 웹 애플리케이션에서는 내장WAS(Web Application Server)가 존재
  • 스프링부트의 자동 설정 기능은 특별한 설정 없이 톰캣 실행 가능

4. 모니터링

  • 개발이 끝난 후 서비스를 운영하는 시기
  • 시스템이 사용하는 스레드, 메모리, 세션 등 주요 요소들을 모니터링해야 함

 

개발에 앞서 알면 좋은 기초 지식

서버 간 통신

서버 간 통신

  • 한 서버가 다른 서버에 통신을 요청하는 것  (서버<->클라이언트)
  • 포털 사이트를 하나의 서비스 단위로 개발하면 서비스를 구동하는 데 걸리는 시간 길어짐
  • 이러한 문제를 해결하기 위해 마이크로서비스 아키텍처(MSA: Microservice Architecture)가 등장
  • 마이크로서비스 아키텍처 : 서비스 규모를 작게 나누어 구성한 아키텍처

단일 서비스 아키텍처  vs. 마이크로서비스 아키텍처

  • A 포털 사이트(단일 서비스) - 독립적인 애플리케이션을 개발하게 되면 각 서비스 간에 통신해야 하는 경우가 발생함                                                   Ex) 블로그 기능 사용을 위해 로그인을 거쳐야만 함(=서버 간 통신)
  • B 포털 사이트(마이크로서비스) - 서비스 기능별로 구분되어 있음

 

스프링 부트의 동작 방식

    • 기본적으로 톰캣(Tomcat)을 사용하는 스프링 MVC 구조를 기반으로 동작함
    • 서블릿(Servlet): 클라이언트의 요청을 처리, 결과를 반환하는 자바 웹 프로그래밍 기술                                                                          서블릿 컨테이너(Servlet Container)에서 관리함.
    • 서블릿 컨테이너(Servlet Container): 서블릿 인스턴스 생성, 관리
    • 톰캣: WAS의 역할과 서블릿 컨테이너의 역할을 수행하는 대표적인 컨테이너

 

스프링 부트의 동작 구조

                               

(1)   DispatcherServlet으로 요청이 들어오면 DispatcherServlet은 핸들러(컨트롤러) 매핑을 통해 요청 URI에 매핑된 핸들         러를 탐색함

(2)   핸들러 어댑터로 컨트롤러를 호출함

(3)   핸들러 어댑터에 컨트롤러의 응답이 돌아오면 ModelAndView로 응답을 가공해 반환

(4)   뷰 형식으로 리턴하는 컨트롤러를 사용할 때는 뷰 리졸버를 통해 뷰를 받아 리턴함

 

레이어드 아키텍처

레이어드 아키텍처(Layered Architecture)

  • 애플리케이션의 컴포넌트를 유사 관심사를 기준으로 레이어로 묶어 수평적으로 구성한 구조
  • 일반적으로 3계층 혹은 4계층

 

프레젠테이션 계층

  • 애플리케이션의 최상단 계층
  • 클라이언트의 요청을 해석, 응답하는 역할

비즈니스 계층

  • 애플리케이션이 제공하는 기능을 정의하는 역할
  • 세부 작업을 수행하는 도메인 객체를 통해 업무를 위임하는 역할

데이터 접근 계층

  • 데이터베이스에 접근하는 일련의 작업 수행

레이어드 아키텍처 기반 설계의 특징

  • 각 레이어는 가장 가까운 하위 레이어의 의존성을 주입받음
  • 각 레이어는 관심사에 따라 묶여 있으며, 다른 레이어의 역할을 침범하지 않음                                                                 -> 코드의 가독성과 기능 구현에 유리함. 코드의 확장성 향상
  • 각 레이어가 독립적으로 작성되면 다른 레이어와의 의존성을 낮춰 단위 테스트에 용이

 

디자인 패턴

  • 생성패턴 : 객체 생성에 사용되는 패턴. 객체를 수정해도 호출부가 영향을 받지 않게 함
  • 구조패턴 : 객체를 조합해서 더 큰 구조를 만드는 패턴
  • 행위패턴 : 객체 간의 알고리즘이나 책임 분배에 관한 패턴

REST API

  • REST : ‘Representational State Transfer’
  • API : 'Application Programming Interface'
  • REST API : REST 아키텍처를 따르는 시스템/애플리케이션 인터페이스

REST 특징

  • 무상태성- 서버에 상태 정보를 따로 보관하거나 관리하지 않는다는 의미->비즈니스 로직의 자유도가 높고 설계가 단순함
  • 캐시 가능성- REST는 HTTP 표준을 그대로 사용하므로 HTTP의 캐싱 기능을 적용할 수 있음->서버의 트랜잭션 부하가 줄어 효율적. 성능 개선
  • 레이어 시스템- 네트워크 상의 여러 계층으로 구성됨. 
  • '클라이언트-서버' 아키텍처 – REST 서버는 API를 제공하고 클라이언트는 사용자 정보를 관리하는 구조로 분리해 설계함->서로에 대한 의존성을 낮추는 기능

 

 

더보기

Quiz.

1. 제어역전(IoC)에서 IoC는 Inversion of (  Control  )의 약자이다.

2. 제어역전의 방법 중 하나로 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식은?

->(  의존성 주입  )

 

3.

@RestController
public class InjectionController {
    
    MyService myService;
    
    @Autowired
    public void setMyService(MyService myService){
        this.myService=myService;
    }
}

위의 코드는 의존성을 주입받는 세가지 방법 중 어느 방법을 이용한 것인가?

->(  Setter 메서드를 통한 의존성 주입  )

 

4. 별도로 설정을 관리해줘야 하는 스프링 프레임워크의 불편함을 해결하기 위해 등장한 것은?

->(   스프링 부트   )

 

5. 내장 WAS에서 WAS가 각각 가리키는 단어는?

->(  Web  Application   Server   )

 

6. 개발이 끝난 후 서비스를 운영하는 시기에는 무엇을 해야하는가?

->(   모니터링   

 

7. 레이어드 아키텍처에서 애플리케이션의 최상단 계층이자 클라이언트의 요청을 해석하고 응답하는 역할을 하는 계층은?

->(  프레젠테이션 계층  )

 

8. 핸들러 매핑 인터페이스의 구현체 클래스 중 (  SimpleUrlHandlerMapping  )은 URL 패턴에 매핑된 컨트롤러를 사용하는 전략이다.

 

9. 필드 객체 선언을 통한 의존성을 주입하는 코드이다. 괄호 안에 코드를 작성하시오.

@RestController
public class FieldInjectionController {
    
   
}

답:  @ Autowired
      private MyService myService;

 

 

 

[출처] 장정우, 스프링부트 핵심 가이드』, 위키북스(2022)

 

                      ⓒ jiwon

728x90

관련글 더보기