스프링 프레임워크
→ 자바 기반의 애플리케이션 프레임워크
→ 엔터프라이즈급 애플리케이션을 개발하기 위한 다양한 기능 제공
* 엔터프라이즈급 개발: 기업 환경을 대상으로 하는 개발
스프링의 핵심 가치
→ 개발자가 비즈니스 로직 구현에만 집중할 수 있게끔 하는 것
제어 역전(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
스프링 부트의 각 웹 애플리케이션에 존재
모니터링
스프링 부트에는 스프링 부트 액추에이터라는 자체 모니터링 도구 有
한 서버가 다른 서버에 통신을 요청하는 것을 의미
→ 한 대는 서버, 다른 한 대는 클라이언트가 되는 구조
마이크로서비스 아키텍처를 적용하면 각 서비스 간에 통신해야 하는 경우 발생
→ 마이크로서비스 아키텍처: 기능별로 서비스 규모를 작게 나누어 구성한 아키텍처
spring-boot-starter-web 모듈 사용 시 기본적으로 톰캣(Tomcat)을 사용하는 스프링 MVC 구조를 기반으로 동작
서블릿 컨테이너
서블릿(클라이언트의 요청을 처리하고 결과를 반환하는 자바 웹 프로그래밍 기술)을 관리
서블릿 인스턴스를 생성하고 관리하는 역할을 수행하는 주체
<특징>
<DispatcherServlet의 동작>
* 핸들러 매핑: 요청 정보를 기준으로 어떤 컨트롤러를 사용할지 선정하는 인터페이스
애플리케이션의 컴포넌트를 유사 관심사를 기준으로 레이어로 묶어 수평적으로 구성한 구조
어떻게 설계하느냐에 따라 용어와 계층의 수는 상이 → 일반적으로는 3계층 or 4계층 구성
소프트웨어를 설계할 때 자주 발생하는 문제들을 해결하기 위해 고안된 해결책
<GoF 디자인 패턴의 구분>
대중적으로 가장 많이 사용되는 애플리케이션 인터페이스
REST(Representational State Transfer)
→ 주고받는 자원(Resource)에 이름을 규정하고 URI에 명시
→ HTTP method(GET, POST, PUT, DELETE)를 통해 해당 자원의 상태를 주고 받는 것
API(Application Programming Interace)
→ REST 아키텍처를 따르는 시스템/애플리케이션 인터페이스
→ API를 통해 서버 또는 프로그램 사이 연결 가능
<REST의 특징>
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 메서드 설정하고 쿼리, 파라미터 담아 요청 전송 가능
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 {
// 코드 작성
}
1. 비즈니스 로직
2. 제어 역전
3. 생성자
4. 레퍼런스 객체, 초기화
5. URI, 상태
6. Spring Initializr
7. src/main/java/com/hello/controller/
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
[스프링 3팀] 6장. 데이터베이스 연동 (1) | 2024.11.29 |
---|---|
[스프링 3팀] 5장~6.5장. API 작성과 데이터베이스 연동 (1) | 2024.11.22 |
[스프링 3팀] 스프링 입문 섹션 7~8 (2) | 2024.11.07 |
[스프링 3팀] 스프링 입문 섹션 5~6 (0) | 2024.10.11 |
[스프링 3팀] 스프링 입문 섹션 4 (0) | 2024.10.04 |