상세 컨텐츠

본문 제목

[스프링 3팀] 1장~4장. 스프링 부트 개발 환경과 애플리케이션 개발하기

24-25/Spring 3

by Igumi 2024. 11. 14. 21:55

본문

728x90

 

 

 

01. 스프링 부트란?

스프링 프레임워크

스프링 프레임워크
→ 자바 기반의 애플리케이션 프레임워크
→ 엔터프라이즈급 애플리케이션을 개발하기 위한 다양한 기능 제공
        * 엔터프라이즈급 개발: 기업 환경을 대상으로 하는 개발
스프링의 핵심 가치
→ 개발자가 비즈니스 로직 구현에만 집중할 수 있게끔 하는 것

 

 

제어 역전(IoC) - Inversion of Control

일반적인 개발: 객체를 생성하고 사용하는 일련의 작업을 개발자가 직접 제어하는 구조

IoC 적용 환경: 객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 구조 

                        → 의존성 주입, 관점 지향 프로그래밍 등이 가능해짐

 

 

의존성 주입(DI) - Dependency Injection

제어 역전 방법 중 하나, 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식

@Autowired라는 어노테이션을 통해 의존성 주입 가능

 

<의존성을 주입받는 방법>

// 생성자를 통한 의존성 주입
// 스프링 4.3 이후 버전은 @Autowired 어노테이션 생략 가능

@RestController
public class DIController {
	MyService myService;
    
    @Autowired
    public DIController(MyService myService) {
    	this.myService = myService;
    }
    
    @GetMapping("/di/hello")
    public String getHello() {
    	return myService.getHello();
    }
}
// 필드 객체 생성을 통한 의존성 주입

@RestController
public class FieldInjectionController {

	@Autowired
   	private MyService myService;
}
// setter 메서드를 통한 의존성 주입

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

 

→ 위 세 가지 방법 중 스프링 공식 문서에서는 생성자를 통한 의존성 주입을 권장
    : 다른 방식과는 다르게 레퍼런스 객체 없이는 객체를 초기화할 수 없게 설계할 수 있기 때문

 

 

관점 지향 프로그래밍(AOP) - Aspect-Oriented Programming

관점을 기준으로 묶어 개발하는 방식

관점: 기능 구현 시 그 기능을 '핵심 기능'과 '부가 기능'으로 구분해 각각을 하나의 관점으로 보는 것

 

 

스프링 부트

스프링은 필요한 모듈들을 추가하다 보면 설정이 복잡해지는 문제 有
→ 이 문제를 해결하기 위해 등장한 스프링 부트

 

 

의존성 관리

스프링 프레임워크: 개발에 필요한 각 모듈의 의존성을 직접 설정, 호환되는 버전 명시해야 정상 동작

스프링 부트: spring-boot-starter라는 의존성 제공

 

자동 설정

스프링 프레임워크의 기능을 사용하기 위해 스프링 부트가 지원하는 것

애플리케이션에 추가된 라이브러리를 실행하는 데 필요한 환경 설정을 알아서 찾아줌

 

내장 WAS - Web Application Server

스프링 부트의 각 웹 애플리케이션에 존재 

 

모니터링

스프링 부트에는 스프링 부트 액추에이터라는 자체 모니터링 도구 有

 


 

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

서버 간 통신

한 서버가 다른 서버에 통신을 요청하는 것을 의미
→ 한 대는 서버, 다른 한 대는 클라이언트가 되는 구조

마이크로서비스 아키텍처를 적용하면 각 서비스 간에 통신해야 하는 경우 발생
마이크로서비스 아키텍처: 기능별로 서비스 규모를 작게 나누어 구성한 아키텍처

 

 

스프링 부트의 동작 방식

spring-boot-starter-web 모듈 사용 시 기본적으로 톰캣(Tomcat)을 사용하는 스프링 MVC 구조를 기반으로 동작

 

서블릿 컨테이너

서블릿(클라이언트의 요청을 처리하고 결과를 반환하는 자바 웹 프로그래밍 기술)을 관리

서블릿 인스턴스를 생성하고 관리하는 역할을 수행하는 주체

 

<특징>

  1. 서블릿 객체 생성, 초기화, 호출, 종료하는 생명 주기 관리
  2. 서블릿 객체는 싱글톤 패턴으로 관리
  3. 멀티 스레딩 지원

<DispatcherServlet의 동작>

  1. DispatcherServlet으로 요청(HttpServletRequest)이 들어오면, 핸들러 매핑(Handler Mapping)을 통해 요청 URI에 매핑된 핸들러를 탐색한다. 여기서 핸들러는 컨트롤러(Controller)를 의미한다.
  2. 핸들러 어댑터(HandlerAdapter)로 컨트롤러를 호출한다.
  3. 핸들러 어댑터에 컨트롤러의 응답이 돌아오면 ModelAndView로 응답을 가공해 반환한다.
  4. 뷰 형식으로 리턴하는 컨트롤러를 사용할 때는 뷰 리졸버(View Resolver)를 통해 뷰(View)를 받아 반환한다.

* 핸들러 매핑: 요청 정보를 기준으로 어떤 컨트롤러를 사용할지 선정하는 인터페이스

 

 

레이어드 아키텍처

애플리케이션의 컴포넌트를 유사 관심사를 기준으로 레이어로 묶어 수평적으로 구성한 구조
어떻게 설계하느냐에 따라 용어와 계층의 수는 상이 → 일반적으로는 3계층 or 4계층 구성
  1. 프레젠테이션 계층 (유저 인터페이스(UI) 계층)
    : 클라이언트로부터 데이터와 함께 요청을 받고 처리 결과를 응답으로 전달하는 역할
    : UI나 API를 제공
  2. 비즈니스 계층 (서비스(Service) 계층)
    : 애플리케이션이 제공하는 기능을 정의하고 세부 작업을 수행하는 도메인 객체를 통해 업무를 위임하는 역할
    : 핵심 비즈니스 로직을 구현하는 영역
    : 트랜잭션 처리나 유효성 검사 등의 작업 수행
  3. 데이터 접근 계층 (영속(Persistence) 계층)
    : 데이터베이스에 접근하는 작업 수행
    : Spring Data JPA에서는 DAO 역할을 리포지토리가 수행하기 때문에 리포지토리로 대체 가능

 

디자인 패턴

소프트웨어를 설계할 때 자주 발생하는 문제들을 해결하기 위해 고안된 해결책

 

<GoF 디자인 패턴의 구분>

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

 

REST API

대중적으로 가장 많이 사용되는 애플리케이션 인터페이스

REST(Representational State Transfer)
→ 주고받는 자원(Resource)에 이름을 규정하고 URI에 명시
→ HTTP method(GET, POST, PUT, DELETE)를 통해 해당 자원의 상태를 주고 받는 것

API(Application Programming Interace)
→ REST 아키텍처를 따르는 시스템/애플리케이션 인터페이스
→ API를 통해 서버 또는 프로그램 사이 연결 가능

 

<REST의 특징>

  1. 유니폼 인터페이스: 일관된 인터페이스, 프로그래밍 언어와 상관없이 플랫폼 및 기술에 종속 X
  2. 무상태성(Stateless): 서버에 상태 정보를 따로 보관/관리 X
  3. 캐시 가능성: HTTP의 캐싱 기능 적용 가능
  4. 레이어 시스템: REST 서버는 네트워크 상의 여러 계층으로 구성 가능
  5. 클라이언트-서버 아키텍처: REST 서버는 API를 제공, 클라이언트는 사용자 정보를 관리하는 구조로 분리해 설계


 

03. 개발 환경 구성

  1. 자바 JDK 설치
    https://www.oracle.com/java/technologies/downloads/
  2. 인텔리제이 IDEA 설치
    https://www.jetbrains.com/ko-kr/idea/download/?section=windows#section=windows


 

04. 스프링 부트 애플리케이션 개발하기

1. 프로젝트 생성
    1) IntelliJ IDEA Ultimate 버전에 내장된 Spring Initializr 이용
    2) 스프링 공식 사이트 이용

 

2. pom.xml 파일

    → 메이븐의 기능을 사용하기 위해 작성하는 파일

 

3. 빌드 관리 도구
    → JVM이나 WAS가 프로젝트를 인식하고 실행할 수 있게 작성한 소스코드와 프로젝트에 사용된 파일들을 빌드하는 도구
    → 라이브러리 간 호환성 체크 문제 해결 가능

 

4. 메이븐 

    → 자바 기반의 프로젝트를 빌드하고 관리하는 데 사용하는 도구
    → pom.xml 파일에 필요한 라이브러리를 추가하면 해당 라이브러리에 필요한 라이브러리까지 함께 내려받아 관리

 

5. 컨트롤러 작성

// controller/HelloController.java

package com.springboot.hello.hello.Controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello() {
        return "Hello World";
    }
}

 

6. 애플리케이션 실행

 

7. 웹 브라우저로 동작 테스트
    → http://localhost:8080/hello 접속하여 출력 확인

 

8. Talend API Tester로 동작 테스트
    → HTTP 통신을 테스트하는 크롬 확장 프로그램
    → GET, POST, PUT, DELETE 등의 HTTP 메서드 설정하고 쿼리, 파라미터 담아 요청 전송 가능

 


Blank Quiz

  1. 객체의 제어권을 컨테이너로 넘기면 개발자는 (                )을 작성하는 데 더 집중할 수 있다.
  2. 객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것을 (                 )이라고 한다.
  3. 의존성을 주입받는 세 가지 방법 중 스프링 공식 문서에서 권장하는 것은 (       )를 통한 방식이다.
  4. 위 방식을 권장하는 이유는 (             ) 없이는 객체를 (        )할 수 없기 때문이다.
  5. REST API는 자원을 (      )에 명시하고, HTTP 메서드를 통해 해당 자원의 (      )를 주고받는다.
  6. (                   )를 이용하면 스프링 부트 프로젝트를 쉽게 생성할 수 있다.
  7. 'hello'라는 프로젝트가 있을 때 컨트롤러는 (                             ) 디렉토리 내에 위치한다.

 

 

Programming Quiz

1. 다음은 필드 객체 생성을 통하여 의존성을 주입받는 코드이다. 생성자를 통한 의존성 주입 방식으로 코드를 수정하시오.

@RestController
public class NameController {

    @Autowired
    private MyName myName;
}

 

2. 다음 코드를 이용하여 http://localhost:8080/name에 접속했을 때, 본인의 이름을 반환하는 코드를 작성하시오.

package com.springboot.name.name.Controller;

// import org.springframework.web.bind.annotation.작성;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MynameController {
    // 코드 작성
}

 


더보기

Blank Quiz

 

1. 비즈니스 로직

2. 제어 역전

3. 생성자

4. 레퍼런스 객체, 초기화

5. URI, 상태

6. Spring Initializr

7. src/main/java/com/hello/controller/

 

Programming Quiz

1.

@RestController
public class NameController {

    MyName myName;

    @Autowired
    public NameController(MyName myName) {
        this.myName = myName;
    }
}

 

2.

package com.springboot.name.name.Controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MynameController {
    
    @RequestMapping("/myname")
    public String myname() {
        return "UMI"; // 본인 이름으로 변경
    }
}

 

 

 

[출처] 장정우, 「스프링부트 핵심 가이드」 1장~4장

 

Corner Spring 3

ⓒ UMI

728x90

관련글 더보기