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

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 구조를 기반으로 동작
서블릿 컨테이너
서블릿(클라이언트의 요청을 처리하고 결과를 반환하는 자바 웹 프로그래밍 기술)을 관리
서블릿 인스턴스를 생성하고 관리하는 역할을 수행하는 주체
<특징>
- 서블릿 객체 생성, 초기화, 호출, 종료하는 생명 주기 관리
- 서블릿 객체는 싱글톤 패턴으로 관리
- 멀티 스레딩 지원
<DispatcherServlet의 동작>
- DispatcherServlet으로 요청(HttpServletRequest)이 들어오면, 핸들러 매핑(Handler Mapping)을 통해 요청 URI에 매핑된 핸들러를 탐색한다. 여기서 핸들러는 컨트롤러(Controller)를 의미한다.
- 핸들러 어댑터(HandlerAdapter)로 컨트롤러를 호출한다.
- 핸들러 어댑터에 컨트롤러의 응답이 돌아오면 ModelAndView로 응답을 가공해 반환한다.
- 뷰 형식으로 리턴하는 컨트롤러를 사용할 때는 뷰 리졸버(View Resolver)를 통해 뷰(View)를 받아 반환한다.
* 핸들러 매핑: 요청 정보를 기준으로 어떤 컨트롤러를 사용할지 선정하는 인터페이스
레이어드 아키텍처
애플리케이션의 컴포넌트를 유사 관심사를 기준으로 레이어로 묶어 수평적으로 구성한 구조
어떻게 설계하느냐에 따라 용어와 계층의 수는 상이 → 일반적으로는 3계층 or 4계층 구성
- 프레젠테이션 계층 (유저 인터페이스(UI) 계층)
: 클라이언트로부터 데이터와 함께 요청을 받고 처리 결과를 응답으로 전달하는 역할
: UI나 API를 제공 - 비즈니스 계층 (서비스(Service) 계층)
: 애플리케이션이 제공하는 기능을 정의하고 세부 작업을 수행하는 도메인 객체를 통해 업무를 위임하는 역할
: 핵심 비즈니스 로직을 구현하는 영역
: 트랜잭션 처리나 유효성 검사 등의 작업 수행 - 데이터 접근 계층 (영속(Persistence) 계층)
: 데이터베이스에 접근하는 작업 수행
: Spring Data JPA에서는 DAO 역할을 리포지토리가 수행하기 때문에 리포지토리로 대체 가능
디자인 패턴
소프트웨어를 설계할 때 자주 발생하는 문제들을 해결하기 위해 고안된 해결책
<GoF 디자인 패턴의 구분>
- 생성(Creational) 패턴: 객체 생성에 사용되는 패턴으로 객체를 수정해도 호출부가 영향을 받지 않게 하는 패턴
- 구조(Structural) 패턴: 객체를 조합해서 더 큰 구조를 만드는 패턴
- 행위(Behavioral) 패턴: 객체 간의 알고리즘이나 책임 분배에 관한 패턴
REST API
대중적으로 가장 많이 사용되는 애플리케이션 인터페이스
REST(Representational State Transfer)
→ 주고받는 자원(Resource)에 이름을 규정하고 URI에 명시
→ HTTP method(GET, POST, PUT, DELETE)를 통해 해당 자원의 상태를 주고 받는 것
API(Application Programming Interace)
→ REST 아키텍처를 따르는 시스템/애플리케이션 인터페이스
→ API를 통해 서버 또는 프로그램 사이 연결 가능
<REST의 특징>
- 유니폼 인터페이스: 일관된 인터페이스, 프로그래밍 언어와 상관없이 플랫폼 및 기술에 종속 X
- 무상태성(Stateless): 서버에 상태 정보를 따로 보관/관리 X
- 캐시 가능성: HTTP의 캐싱 기능 적용 가능
- 레이어 시스템: REST 서버는 네트워크 상의 여러 계층으로 구성 가능
- 클라이언트-서버 아키텍처: REST 서버는 API를 제공, 클라이언트는 사용자 정보를 관리하는 구조로 분리해 설계
03. 개발 환경 구성
- 자바 JDK 설치
https://www.oracle.com/java/technologies/downloads/ - 인텔리제이 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
- 객체의 제어권을 컨테이너로 넘기면 개발자는 ( )을 작성하는 데 더 집중할 수 있다.
- 객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것을 ( )이라고 한다.
- 의존성을 주입받는 세 가지 방법 중 스프링 공식 문서에서 권장하는 것은 ( )를 통한 방식이다.
- 위 방식을 권장하는 이유는 ( ) 없이는 객체를 ( )할 수 없기 때문이다.
- REST API는 자원을 ( )에 명시하고, HTTP 메서드를 통해 해당 자원의 ( )를 주고받는다.
- ( )를 이용하면 스프링 부트 프로젝트를 쉽게 생성할 수 있다.
- '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