상세 컨텐츠

본문 제목

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

24-25/Spring 1

by oze 2024. 11. 15. 10:33

본문

728x90

 

 

 

 

 

1장. 스프링 부트란?

스프링 프레임워크

  • 자바 기반의 애플리케이션 프레임워크로, 엔터프라이즈급 애플리케이션*을 개발하기 위한 다양한 기능을 제공한다.
  • "애플리케이션 개발에 필요한 기반을 제공해서 개발자가 비즈니스 로직 구현에만 집중할 수 있게끔 하는 것"이 스프링의 핵심 가치이다. 

* 엔터프라이즈급 애플리케이션: 기업 환경을 대상으로 하는 개발 

 

 

 

 

제어 역전 (IoC, Inversion of Control)

  • 일반적인 자바 개발은 객체를 생성하고 사용하는 일련의 작업을 개발자가 직접 제어하는 구조이다. 
  • 제어 역전이란 객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것을 말한다. 
  • IoC를 적용한 환경에서는 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부에 위임한다. 
  • 제어 역전을 통해 의존성 주입(DI; Dependency Injection), 관점 지향 프로그래밍(AOP; Aspect-Oriented Programming) 등이 가능해진다. 

 

 

 

의존성 주입 (DI, Dependency Injection)

  • 제어 역전의 한 방법이다. 
  • 사용할 객체를 직접 생성하지 않고, 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식이다. 
  • 스프링에서는 @Autowired라는 어노테이션을 통해 의존성을 주입할 수 있다. 

 

 

 

스프링에서 의존성을 주입받는 방법

 

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

  • 레퍼런스 객체 없이는 객체를 초기화할 수 없게 설계할 수 있기 때문에, 스프링 공식 문서에서 권장하는 방법이다. 
@RestController
public class DIContoller {
    MyService myService;	

    
    @Autowired
    public DIContoller(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;
    }
}

 

 

 

 

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

  • 관점을 기준으로 묶어 개발하는 방식이다. 
  • 관점은 어떤 기능을 구현할 때 그 기능을 '핵심 기능''부가 기능'으로 구분해 각각을 하나의 관점으로 보는 것을 의미한다. 
  • 스프링은 디자인 패턴 중 하나인 프락시 패턴을 통해 AOP기능을 제공하고 있다. 

 

 

 

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

  • 스프링 프레임워크는 엔터프라이즈 애플리케이션 개발을 위한 유연하고 강력한 프레임워크로, 다양한 설정과 구성이 필요하다. 
  • 스프링 부트는 스프링 프레임워크 기반의 애플리케이션 개발을 간소화하는 도구로, 자동 설정과 내장 서버를 제공하여 빠른 개발이 가능하다.
  • 즉, 스프링 부트를 사용하면 복잡한 설정 없이 쉽게 개발을 할 수 있다. 

 

 

 

스프링 부트의 특성 

 

1. 의존성 관리

  • 스프링 프레임워크의 문제점 : 개발에 필요한 각 모듈의 의존성을 직접 설정해야 한다. 
  • ‘spring-boot-starter'라는 의존성을 제공하여, 각 라이브러리의 기능과 관련해서 자주 사용되고 호환되는 버전의 버전의 모듈 조합을 제공한다. 
  • 이를 통해 라이브러리 호환 문제를 해결한다. 

 

2. 자동 설정 

  • 애플리케이션에 추가된 라이브러리를 실행하는 데 필요한 환경 설정을 알아서 찾아준다. 
  • 개발에 필요한 의존성을 추가하면 프레임워크가 이를 자동으로 관리한다. 

 

3. 내장 WAS 

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

 

4. 모니터링 

  • 서비스 운영을 위해서는 스레드, 메모리, 세션 등의 주요 요소들을 모니터링해야 한다. 
  • 스프링 부트에는 자체 모니터링 도구인 스프링 부트 액추에이터가 존재한다. 

 

 

 

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

서버 간 통신 

  • 포털 사이트의 다양한 기능들을 단일 서비스로 구성하면 서버의 유지보수가 어려워지고, 서비스 구동 속도가 느려진다. 
  • 마이크로서비스 아키텍처는 이러한 문제를 해결하기 위해, 서비스 규모를 작게 나누어 구성하는 아키텍처이다. 
  • 이렇게 독립적인 애플리케이션을 개발하면, 각 서비스 간에 통신해야 하는 경우가 발생한다. 

 

 

 

스프링 부트의 동작 방식

  • 스프링 부트에서 spring-boot-starter-web 모듈을 사용하면 기본적으로 톰캣을 사용하는 스프링 MVC 구조를 기반으로 동작한다.
  • 서블릿(Servlet)은 클라이언트의 요청을 처리하고 결과를 반환하는 자바 웹 프로그래밍 기술이다.
  • 서블릿 컨테이너(Servlet Container)는 서블릿 인스턴스(Servlet Instance)를 생성하고 관리하는 역할을 수행한다. 
  • 톰캣은 WAS의 역할과 서블릿 컨테이너의 역할을 수행하는 컨테이너이다. 
  • 스프링에서는 DispatcherServlet이 서블릿의 역할을 수행한다. 

 

  • 서블릿 컨테이너의 특징 
  1. 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.
  2. 서블릿 객체는 싱글톤 패턴으로 관리된다.
  3. 멀티 스레딩을 지원한다.

 

  • DispatcherServlet의 동작 과정
  1. DispatcherServlet으로 요청(HttpServletRequest)이 들어오면, 핸들러 매핑(Handler Mapping)을 통해 요청 URI에 매핑된 핸들러를 찾는다. 여기서 핸들러는 컨트롤러(Controller)를 의미한다.
  2. 그런 다음 핸들러 어댑터(HandlerAdapter)로 컨트롤러를 호출한다.
  3. 핸들러 어댑터로부터 컨트롤러의 응답이 돌아오면 ModelAndView로 응답을 가공하여 반환한다.
  4. 뷰 형식으로 리턴하는 컨트롤러를 사용할 때는 뷰 리졸버(View Resolver)를 통해 뷰(View)를 받아 반환한다. 핸들러 매핑은 요청 정보를 기준으로 어떤 컨트롤러를 사용할지 선정하는 인터페이스이다. 

 

 

 

레이어드 아키텍처

  • 애플리케이션의 컴포넌트를 유사 관심사를 기준으로 레이어로 묶어 수평적으로 구성한 구조를 의미한다.
  1. 프레젠테이션 계층 (유저 인터페이스(UI) 계층) : 클라이언트로부터 데이터와 함께 요청을 받고 처리 결과를 응답으로 전달하는 역할이다. 
  2. 비즈니스 계층 (서비스(Service) 계층) : 핵심 비즈니스 로직을 구현하는 영역으로 트랜잭션 처리나 유효성 검사 등의 작업도 수행한다.
  3. 데이터 접근 계층 (영속(Persistence) 계층) : 데이터베이스에 접근해야 하는 작업을 수행한다. Spring Data JPA에서는 DAO 역할을 리포지토리가 수행하기 때문에 리포지토리로 대체할 수 있다.

 

 

 

디자인 패턴

  • 소프트웨어를 설계할 때 자주 발생하는 문제들을 해결하기 위해 고안된 해결책이다. 
  • GoF 디자인 패턴의 종류 

1. 생성 패턴 : 객체 생성에 사용되는 패턴으로, 객체를 수정해도 호출부가 영향을 받지 않게 한다. 

2. 구조 패턴 : 객체를 조합해서 더 큰 구조를 만드는 패턴이다. 

3. 행위 패턴 : 객체 간의 알고리즘이나 책임 분배에 관한 패턴이다. 

 

 

 

 

REST API

  • 대중적으로 가장 많이 사용되는 애플리케이션 인터페이스이다.
  • 이를 통해 클라이언트는 서버에 접근하고 자원을 조작할 수 있다. 

 

1. REST

  • 주고받는 자원에 이름을 규정하고 URI에 명시해 HTTP 메서드(GET, POST, PUT, DELETE)를 통해 해당 자원의 상태를 주고받는 것을 의미한다.

 

2. REST API

  • REST 아키텍처를 따르는 시스템/애플리케이션 인터페이스이다.
  • REST 아키텍처를 구현하는 웹 서비스를 'RESTful'하다고 표현한다. 

 

3. REST 특징

  • 유니폼 인터페이스 : HTTP 표준 전송 규약에 따라 일관된 인터페이스를 갖는다. 
  • 무상태성 : 서버가 상태 정보를 별도로 저장하거나 관리하지 않는다. 
  • 캐시 가능성 : REST에서는 HTTP 표준을 그대로 활용함으로써 HTTP의 캐싱 기능을 적용할 수 있다. 
  • 레이어 시스템 : REST 서버는 네트워크 상에서 다수의 계층으로 구성될 수 있다.
  • 클라이언트-서버 아키텍처 : REST 서버는 API를 제공하고, 클라이언트는 사용자 정보를 관리하는 구조로 분리해 설계한다. 

 

4. REST URI 설계 규칙

  • URI의 마지막에는 ‘/’를 포함하지 않는다.
  • 언더바(_)는 사용하지 않는다. 대신 하이픈(-)을 이용한다.
  • URL에는 행위(동사)가 아닌 결과(명사)를 포함한다.
  • URL은 소문자로 작성해야 한다.
  • 파일의 확장자는 URI에 포함하지 않는다.

 

 

 

 

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

 

1. 프로젝트 생성

  • IntelliJ IDEA Ultimate 버전에 내장된 Spring Initializr를 사용한다. 
  • 혹은 스프링 공식 사이트를 통해 생성한다. 

 

2. pom.xml (Project Object Model) 

  • Maven 프로젝트의 기본 설정 파일이다. 
  • 이 파일에는 프로젝트 구성, 의존성, 플러그인, 목표 빌드 프로파일 등의 프로젝트와 관련된 모든 정보가 포함된다.

 

3. 빌드 관리 도구

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

 

4. 메이븐

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

 

5. Hello World 출력

  • 컨트롤러를 패키지를 생성하고, HelloController 클래스를 생성한다. 

src/main/java/com.example.hello/controller/HelloController.java

package com.example.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. 애플리케이션 실행

  • HelloApplication의 실행 버튼을 누르면 애플리케이션이 실행된다. 

 

7. 웹 브라우저를 통한 동작 테스트

 

 

8. Talend API Tester를 통한 동작 테스트 

  • 크롬 확장 프로그램인 Talend API Tester를 설치하여 실행한다. 
  • 다양한 HTTP 메서드를 설정하고 쿼리와 파라미터를 담아 요청을 보낼 수 있다. 

 

 

 

 

 


QUIZ

1. 개발자가 ( 비즈니스 로직 ) 구현에만 집중할 수 있게끔 하는 것"이 스프링의 핵심 가치이다. 

2. ( 제어 역전 )은/는 객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것을 말한다. 

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

4. ( 스프링 부트 )은/는 스프링 프레임워크 기반의 애플리케이션 개발을 간소화하는 도구이다. 

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

6. ( 프레젠테이션 계층 )은/는 클라이언트로부터 데이터와 함께 요청을 받고 처리 결과를 응답으로 전달하는 역할을 한다. 

7. ( REST API )은/는 대중적으로 가장 많이 사용되는 애플리케이션 인터페이스이며, 이를 통해 클라이언트는 서버에 접근하고 자원을 조작할 수 있다.

 

 


PROGRAMMING QUIZ

 

1. 다음 조건을 만족하는 GoodbyeController를 작성하세요. 

  • 엔드포인트: /goodbye
  • 리턴 값: "Goodbye, see you again!"

힌트: @RequestMapping과 @RestController를 사용하세요.

package com.example.hello.controller;

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

// (1)
public class GoodbyeController {
   // (2) 
}

 

 

 

2. 다음 조건을 만족하는 WelcomeController를 작성하세요.

  • 엔드포인트: /welcome
  • 리턴 값: "Welcome to Spring Boot!"

힌트: @RequestMapping과 @RestController를 사용하세요.

package com.example.hello.controller;

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

// (1)
public class WelcomeController {
    // (2)
}

 

 


 

 

1번 답 

package com.example.hello.controller;

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

@RestController
public class GoodbyeController {
    @RequestMapping("/goodbye")
    public String goodbye() {
        return "Goodbye, see you again!";
    }
}

 

 

2번 답

package com.example.hello.controller;

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

@RestController
public class WelcomeController {
    @RequestMapping("/welcome")
    public String welcome() {
        return "Welcome to Spring Boot!";
    }
}

 

 

 

 

 

 


 

출처: 장정우, 『스프링 부트 핵심 가이드』, 위키북스(2022), p1-52.
Corner Spring 1
Editor:  lyonglyong

728x90

관련글 더보기