스프링부트 기본
📌JSP vs Spring vs Spring boot 차이
1) JSP
java 웹 어플리케이션을 개발하기 위한 기술중 하나 동적 웹페이지를 생성하는데 사용됨 HTML 내에 Java 코드를 삽입하여 사용자 인터페이스와 비즈니스 로직을 결합할수있다
2) Spring Framework
java 기반의 엔터프라이즈 어플리케이션을 개발하기 위한 경량화된 프레임워크 IoC 및 DI를 통해 객체간의 의존성을 관리하고, 코드의 유연성, 테스트 용이성 향상. AOP를 지원하여 코드를 모듈화할 수 있다
3) Spring boot
spring 기반의 어플리케이션을 빠르게 개발하기 위한 프로젝트 설정의 간소화를 위해 기본값을 제공하며 어플리케이션의 구성 및 설정을 자동화 내장된 서버를 통해 웹 어플리케이션을 실행할 수 있어 별도의 웹서버 설치가 필요하지 않음
📌 Spring Framework
자바기반 웹 어플리케이션 개발에 사용하는 프레임워크이다 개발의 복잡성을 줄이고, 비교적 쉽게 테스트가 가능하여 생산성을 높인다. 유지보수 용이하고, 다른 프레임워크와 연동이 매우 뛰어나다(접착성)
기본지식
1) API
어플리케이션 간 상호작용을 가능하게 해주는 인터페이스이다. 다른 어플리케이션에서 제공하는 기능을 사용하며 데이터 교환을 할 수 있으며 해당 기능을 사용시 내부 구현을 몰라도 사용할 수 있도록 도와준다
2) 라이브러리
재사용이 가능한 코드 모음(도구) 라이브러리에서 제공해주는 함수를 활용하면 개발자가 복잡한 알고리즘을 처음부터 구현할 필요가 없다
3) 프레임워크
특정 목적을 위해 만들어진 틀, 규칙이다 어플리케이션 개발을 위한 템플릿의 역할을 하며, 전체적인 구조와 패턴을 정의한다
같은 구조와 패턴을 사용하여 모든 개발자들이 표준화된 방식으로 개발을 할 수 있게 도와주고 개발시간을 단축시켜준다
스프링 프레임워크 주요 특징
1) POJO(Plain Old Java Object) 기반
순수 자바 객체를 사용하므로 기존 코드들을 재사용이 가능하며, 테스트와 유지보수에 유리하다
2)DI(Dependency Injection) : 의존성 주입
스프링의 핵심 기능이며, 클래스들 간 의존성을 낮춰주고 코드 재사용성을 높인다. 스프링에서는 어노테이션으로 쉽게 의존성 주입이 가능하다
* 외부에서 객체를 전달(주입)하여 의존관계를 형성하는 것을 의존성 주입(의존관계 주입)이라고한다 외부에서 전달받은 객체에 대해 결합도를 낮추기 위해서는 인터페이스를 활용하는 것이 일반적이다.스프링에서는 어노테이션으로 쉽게 의존성 주입이 가능하다
3) AOP(Aspect-Oriented Programming) 지원 : 관점 지향 프로그래밍
공통되고 반복되는 관심사(기능 등)를 분리하여 모듈화 한다. 관심사를 분리하면 개발자는 핵심 로직에만 집중하여 코드를 작성할 수 있으며 유지보수에 유리하다. 분리한 기능을 관점(Aspect)이라고 한다
관심사 : 어플리케이션의 기능을 의미
+) 개방폐쇄의 원칙(OCP: Open-Closed Principle)
기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계되어야한다는 원칙을 의미 OCP를 확장에 대해서는 개방적(Open)이고, 수정에 대해서는 폐쇄적(closed)이어야한다는 의미로 정의된다
4) 트랜잭션 관리
xml이나 어노테이션으로 트랜잭션을 쉽게 설정할 수 있다
5) 편리한 MVC구조
스프링은 자체적으로 MVC프레임워크를 제공하여 개발자가 불필요한 코드를 줄일 수 있게 도와준다
6) WAS(웹 어플리케이션 서버)에 종속적이지 않음
특정 WAS만 사용하는 것이 아니라 다양한 서버에서 동작할 수 있다. WAS없이도 독립적인 테스트가 가능하여 테스트가 쉽고 빠르다
7) 단위 테스트
WAS를 실행하지 않고 독립적으로 테스트 하는 방법
8) IoC(Inversion of Control) : 제어권의 역전
객체의 입장에서 사용할 다른 객체를 직접 생성하여 제어한다. 이러한 것이 일반적인 제어 흐름이다. 이 흐름을 반대로 뒤집은 것으로 객체가 사용하는 다른 객체를 직접 생성하지도 않으며 자기 자신도 어디서 사용되는 알 수 없다 특별한 권한을 가진 다른 객체에 의해 결정되고 만들어진다
9) IoC 컨테이너
스프링에서 객체 생성, 관리, 의존성 주입을 담당하는 주요 컴포넌트. IoC 컨테이너는 논리적인 구조이다 즉, 실체가 아니며 IoC컨테이너라는 논리적 구조를 바탕으로 스프링에서 사용하는 실제 구현객체는 BeanFactory와 ApplicationContext 객체이다
BeanFactory : 가장 기본적인 IoC 컨테이너 기능을 제공
ApplicationContext : 좀 더 업그레이드 되어 추가 기능을 제공한다
(스프링 어플리케이션에서 사용하며, 스프링 컨테이너 라고 부른다)
📌스프링 부트
스프링 프레임워크를 기반으로 만들어졌으며 스프링의 단점을 보완하였다. 스프링의 단점인 설정의 복잡함을 개선하여 설정작업을 크게 줄였으며, 톰캣 등의 내장 서버를 가지고 있다
프로젝트 경로
src/main/java : 서버에서 사용하는 java 파일
src/test/java : 단위테스트 java 파일
src/main/resources : 설정파일, 뷰
resources/static : css, js 파일
resources/templates : html 파일
pom.xml 또는 build.gradle : 라이브러리 의존성 관리
application.properties : 서버, DB, 라이브러리 설정 파일
DI(Dependency Injection) : 의존성 주입
스프링에서는 D.I(의존성주입)이라는 것을 편하게 할 수 있게 지원해준다
- 스프링의 도움을 받아야하므로 스프링이 사용할 수 있게 등록을 해줘야한다
@Component : 스프링에 등록할 때 사용하는 어노테이션 - 등록을 마친 클래스들의 객체를 사용할 때 주입받아 사용하면 되므로 직접 new를 쓰지 않는다
@Autowired : 주입을 받고싶은 필드에 사용하는 어노테이션(필드에만 사용한다!)
* 필드가 아닌 지역변수에서 사용할 때는 new를 사용해야한다(메소드에서 사용할때) - 등록을 하게 되면 스프링 컨테이너(IoC 컨테이너)에서 해당 클래스 객체를 만들고 주입하는
등의 관리를 해준다
컨테이너 등록된 객체들을 Bean이라고 한다 - lombok을 사용하면 여러 편리한 기능을 지원해준다
@Data, @Getter, 등등 생성자나 기본적인 메소드를 만들어주는 어노테이션
logging을 사용하게 해주는 @Slf4j - 스프링에서는 단위 테스트를 지원해준다
단위 테스트를 위한 클래스를 별도로 만들어야한다
@SpringBootTest : 단위 테스트를 위한 클래스임을 나타내며, JUnit라이브러리를
이용하므로 독립적인 테스트가 가능하다
@Test : 단위 테스트를 진행할 메소드에 사용하며,
해당 메소드만 개별적으로 실행시킬수있다
주입의 종류
1) 필드 주입
-권장x
- 생성자나 setter를 사용해서 주입을 받는것이 아니기 때문에 스프링의 도움이 없이는
주입이 불가능하여 테스트에서 사용하기 불편하다
- final 키워드 사용이 불가능하여 불변성을 보장받지 못한다
- 순환참조시 예외가 발생하지 않는다
2) 생성자 주입
-가장 권장하는 방법
-생성자에 @Autowired를 사용하면 된다
-만약 private 필드를 초기화 시 setter가 없다고 가정한다면 반드시 생성자를 통해서만 필드를 초기화 해야한다
-객체를 한개 생성할 때는 반드시 생성자가 한번만 실행되고 이후에는 수정할 수가 없다
-생성자 주입을 하게되면 주입된 객체의 불변성이 보장된다
3) setter 주입
-setter를 사용하여 주입하는 방법
-setter에 @Autowired를 사용하면 된다
-특정 필드의 setter를 사용하지 않아도 해당 클래스 객체를 만들수가 있어서 NPE가 발생할 수 있다
-setter를 이용하여 언제든 수정이 가능하게 되므로 불변성이 보장되지 않는다 (객체의 주소가 변경될 가능성이 열려있다는 의미)
-이때 생성자는 필드 초기화 하지 않는다. 세터 통해서 나중에 주입됨.
순환참조
A, B 클래스가 서로 필드 주입을 할 경우 발생하는 문제이다 서로 주입을 하면서 무한반복으로 주입을 하게 된다
필드 주입을 하는 경우엔 실행단계에서 오류가 발생하지 않고 나중에 해당 객체를 사용할 때 오류가 발생하여 큰 문제가 발생하게된다. 생성자 주입을 사용하는 경우 서버 실행에서 오류가 발생하여 순환 참조 문제를 빠르게 파악할 수 있다
+) 컨테이너에 등록되는 객체들은 각 클래스의 기본 생성자를 이용하여 만들게 된다 (단, 생성자 주입을 사용하면 해당 생성자를 사용한다) 생성자가 실행되면 메소드와 동일하게 stack에 영역에 올라가게 되고 순환참조로 인해 무한히 stack영역에
쌓이게 되면 stack이 넘쳐 OverFlow가 발생한다
스프링부트 스타터 : 의존성이 모여있는 그룹, 스타터를 사용하면 필요한 기능을 간편하게 설정할 수 있다
스타터 : spring-boot-starter-[작업유형] 명명규칙이 있음
spring-boot-starter-web Spring MVC를 사용하여 RESTful 웹서비스를
개발할 때 필요한 의존성 모음
spring-boot-starter-test 스프링 어플리케이션을 테스트 하기 위해 필요한 의존성 모음
spring-boot-starter-validation 유효성 검사를 위해 필요한 의존성 모음
spring-boot-starter-autuator 모니터링을 위해 어플리케이션에서 제공하는 다양한 정보를 제공하기 쉽게
하는 의존성 모음
spring-boot-starter-data-jpa ORM을 사용하기 위한 인터페이스의 모음인 JPA를 더 쉽게 사용하기 위한
의존성 모음
build.gradle 파일에서 확인가능
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
}
스프링부트가 의존성을 가져오는 방법
현재 버전에 맞는 라이브러리를 알아서 관리한다
만약 어떤 의존성을 사용하는지 버전별 확인이 필요하다면 스프링 공식문서
Dependency Versions에서 확인가능
스프링 공식 문서 : https://docs.spring.io/spring-boot/docs/current/reference/html/dependency-versions.html