목차
스프링부트에 들어가기 앞서..
IoC
Inversion of Control : 제어 역전
일반적으로 객체를 사용하기 위해 사용자가 직접 객체를 선언하고 해당 객체의 의존성을 생성한 후 객체에 제공
함.
IoC를 적용한 환경에서는 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부에 위임함.
외부란? 스프링 컨테이너 또는 IoC 컨테이너를 말함.
DI
Dependency Injection : 의존성 주입
객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식.
DI 방법
1.
필드 주입
public class UserController {
@Autowired
private UserService userService;
// ...
}
Java
복사
2.
설정자 주입
public class UserController {
private UserService userService;
public setUserSerivce(UserService userService) {
this.userService = userService;
}
// ...
}
Java
복사
3.
생성자 주입
public class UserController {
private UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
// ...
}
Java
복사
스프링부트 공식 문서에서는 3번 생성자 주입을 권장함.
생성자 주입 방법은 참조객체(UserService)가 없으면 객체(UserController)생성이 제한되기 때문이다.
AOP
Aspect-Oriented Programming : 관점지향 프로그래밍
관점이란 어떤 기능을 구현할 때 그 기능을 핵심 기능과 부가 기능으로 구분해 각각을 하나의 관점으로 보는 것을 의미.
여러 비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는 방식.
레이어드 아키텍처
특징
•
가장 가까운 하위 레이어를 의존
•
다른 레이어의 역할을 침범하지 않음.
•
다른 레이어의 의존성을 낮춰 단위 테스트에 용이.
레이어 (계층)
•
프레젠테이션 계층 : Controller
•
비즈니스 계층 : Service
•
데이터 접근 계층 : Dao, Repository
◦
영속화 : DB에 저장하여 application이 꺼지더라도 데이터를 유지할 수 있도록하는 것.
REST API
REST:
주고 받는 자원에 이름을 규정하고 URI에 명시해 HTTP 메서드를 통해 해당 자원의 상태를 주고받는 것.
REST API:
API : Application Programming Interface, 서버 또는 프로그램 사이를 연결
REST API : REST 아키텍처를 따르는 API
특징
•
유니폼 인터페이스
HTTP ㅍ준 전송 규약을 따르기 때문에 어떤 프로그래밍 언어로 만들어졌느냐와 상관없이 호환 가능.
•
무상태성
서버는 클라이언트가 보낸 요청에 대해 세션이나 쿠키를 보관하지 않음.
•
캐시 가능성
HTTP 캐싱 기능 적용 가능
규칙
1.
URI 마지막에 ‘/’를 포함하지 않음.
2.
언더바(_)는 사용하지 않음. → 하이픈(-)으로 대체
3.
URI에는 동사가 아닌 명사를 사용.
4.
URI는 소문자로 작성.
5.
URI에 파일의 확장자는 포함하지 않음.
HTTP
메소드
•
Get
•
Post
•
Put
•
Delete
•
기타…
스프링 ≠ 스프링부트
스프링과 스프링부트는 다르다. 스프링부트는 스프링 프레임워크에 WAS, 편의 기능 등이 추가된 것이다.
스프링부트 특징
•
내장 WAS
WAS(Web Application Server) 기본적으로 톰캣이 내장되어 있음.
•
의존성 관리
라이브러리를 추가할때 다른 라이브러리의 호환성을 체크해야함.
하지만 spring-boot-starter 라이브러리는 서로 호환되는 버전의 모듈 조합을 제공함.
•
자동 설정
애플리케이션에 추가된 라이브러리를 실행하는 데 필요한 환경 설정을 찾아줌.
•
모니터링
스프링 부트 액추에이터라는 모니터링 도구 제공.
스프링부트 프로젝트
생성
인텔리제이 Ultimate
Spring.io
빌드
Gradle
•
Gradle탭 - Task - build - build
Maven
•
Maven탭 - 프로젝트명 - Lifecycle - package
jar 실행
•
java -jar {빌드된 jar파일}
어노테이션(애노테이션)
@RestController
@RequestMapping("/api/v1/hello")
public class HelloController {
@GetMapping("")
public String hello() {
return "Hello World";
}
@GetMapping("/{value}")
public String pathValue(@PathVariable("value") String value) {
return "echo " + value;
}
}
Java
복사
@RestController
dispatcherServlet이 매핑해줄 Controller를 등록.
@RequestMapping
경로와 HTTP메소드를 매핑해주는 어노테이션.
클래스에 붙일 경우 클래스에 속한 모든 메소드에 공통적으로 적용됨.
@GetMapping
@GetMapping은 @RequestMapping 에 HTTP 메소드를 미리 설정해서 제공해줌.
그 외
•
@PostMapping
•
@PutMapping
•
@DeleteMapping
등이 존재함.
@PathValue
경로에 담겨온 변수를 받는 어노테이션
@GetMapping("/{value}") // {} 안에 변수 이름을 넣는다
public String pathValue(@PathVariable("value") String value) {
// 파라미터의 변수명과 URI경로에 적은 변수 이름이 같다면 @PathVariable() 안에 인자는 생략 가능함.
// 만약 다르다면 인자로 URI경로에 적은 변수 이름을 넣어준다.
return "echo " + value;
}
Java
복사