본문 바로가기

WINK-(Web & App)/Spring Boot 스터디

[2024 Spring Boot 스터디] 정호용 #1 주차 - 0~2장 Spring Boot와 친해지기

반응형

스프링부트 스터디를 이번 학기 부로 시작하게 되었습니다 :)

이번 주차 분량은 교재 '스프링부트 3 백엔드 개발자 되기' 0~2장 까지 입니다.

 

00장. 개발 환경 구축하기

0.0 그림으로 이해하는 프로젝트

 

그림으로 그려보았다!

✅ 즉, SpringBootDeveloperApplication Class가 Spring Boot Application의 시작점이고,

애플리케이션 설정에 필요한 내용은 build.gradle파일에서 읽어서 의존성 주입을 한다.

 

0.1 IntelliJ 설치 및 설정

 IntelliJ는 자바 통합 개발 환경(IDE) 소프트웨어 이다.

(대충 이렇게 생겼다.)

✅ 이클립스와 양대산맥이라고 한다.

✅ IntelliJ는 이미 설치되어 있기 때문에, 1단계는 건너뛰었다.

 

✅ 2단계 ~ 3단계

JDK를 설치해 주도록 하자. 교재대로 따라하면 No SDK 부분을 누르면 Add SDK 버튼이 있다.

교재 버전은 2022 버전이고, 필자가 설치한 버전은 2023버전이다.

즉, Add JDK를 눌러서 Download JDK로 가는 것이 아닌 그냥 윗 사진처럼 Download JDK를 누르면 된다.

여기서 문제가 발생한다.

교재에서는 Oracle OpenJDK 17버전이 설치되어 있는데, 확인해본 결과 해당 제조사의 버전은 22밖에 없다.

우선 JDK과 springboot의 버전에 따라 에러가 생길수도 있다고 해서, 교재 버전에 맞추어 타사의 JDK 17을 설치하였다.

 교재를 다시 읽어보니 제조사는 상관없다고 한다.

 

그리고 교재 설명대로 언어는 JAVA, 프로젝트 유형은 Gradle을 눌렀더니...

너 어디갔니...?

어디갔냐고

다시 다운로드 버튼을 눌러 설치 경로를 확인해 본다. 알고 보니 Vendor에 따라 경로가 다 다르다. (주의)

그리고 나서 Add JDK를 눌러 해당 경로를 열어봤는데...

 비어있다! 아까 JDK17 다운받은 그 경로 맞다!

Finder로 원래 경로 가봤으나 파일을 어떻게 꽁꽁 숨긴건지 폴더크기 0바이트.. 그냥 재설치 해줬다.

일부러 교재와 동일하게 설정해줬다.

여러분도 그런 적 있지 않나요

학교에서 C++이나 자바 배울때 환경변수 등등 이것저것 설정 많이 하는데

교수님이 하시는 대로 안했다가 이상한데서 오류떠서 고생한 적...

전 있어요 하하

 

4단계

밝은 테마로 바꾸라는데..

다크모드를 선호하므로 패스하겠습니다.

 

Build System 중 Maven 과 Gradle의 차이?

Gradle은 Maven에 비해 가독성이 좋고 설정이 간단하다.

다양한 언어 지원, 원하는 대로 빌드 스크립트 작성이 가능하다.

빌드와 테스트 속도가 Maven에 비해 빠르다.

 

0.2 스프링 부트 3 프로젝트 만들기

 1단계

지금까지는 스프링 부트 3 프로젝트가 아닌 그냥 Gradle 프로젝트를 생성한 거다.

이걸 스프링부트 3 프로젝트로 바꿔야 한다.

build.gradle을 수정하기만 하면 된다. 저 파일을 찾아 클릭해 준다.

 

2단계

교재의 값에 맞게 build.gradle을 수정해 준다. 그런데...

프로젝트의 버전을 교재의 버전과 비교하라는 말이 도통 무슨 말인지 모르겠다.

문맥 상 스프링부트의 버전을 체크하라는 거 같은데...

이전 단계에서 스프링부트 관련 파일을 설치한 기억이 없는데...

 

일단 교재대로 수정했습니다!

✅ 3번 라인 : 스프링부트 플러그인

✅ 4번 라인 : 스프링의 의존성 관리

✅ 7-9번 라인 : 그룹 이름과 버전, 컴파일 시 사용할 자바 버전

✅ 11-12번 라인 : 의존성 받을 저장소

✅ 15-17번 라인 : 프로젝트 개발 시 필요기능의 의존성. 16번 라인은 웹 관련 기능, 17번 라인은 테스트 기능 제공

 

 3단계

코끼리 그림의 Gradle을 누른 뒤,

새로고침 그림을 눌러주자.

 

 4단계

 

 5단계

이제 src/main/java를 누르고 > 마우스 우클릭 > New > Package를 눌러준다.

패키지명은

<그룹이름>.<프로젝트이름> 형식으로 입력하자!

 

 6단계

이제 패키지 안에 클래스를 만들어 주자.

패키지 우클릭 > New > Java Class 클릭

클래스명은

<프로젝트이름><Application> 형식으로 입력하자!

 

 7단계

메인 클래스를 위와 같이 작성하자.

 

 8단계

클래스 우클릭 > Run 'SpringBootDeveloperA....' 클릭

맨 아랫줄에 스프링 어플리케이션이 시작되었다는 메시지를 체크한다.

 

 9단계

웹 브라우저 > localhost:8080에 접속

Why....Whyrano....?

404오류는 실행은 되었지만, 보여줄 페이지가 없어서 뜨는 것이다!

localhost:8080을 요청 > index.html 을 찾도록 설정됨

하지만 index.html이 아직 없어서 그렇다!

 

10단계

없으면 만들면 되지 아니한가.

Resources 우클릭 > New > File 클릭 후

static/index.html이라는 이름을 지어준다.

(static이라는 디렉토리와 index.html이라는 파일을 동시에 만들어준다! 왜냐고? 둘다 없으니까!)

 

 11단계-12단계

파일 내용 입력 후, 상단의 초록 버튼을 눌러 서버를 재시작 해 준다.

 

 13단계

localhost:8080에 재접속 해 주면...

성공~

 

0.3 포스트맨 설치하기

신촌을 못가 부른사람 아닙니다.

 

포스트맨이란..

HTTP 요청을 보낼 수 있는 클라이언트 이다.

✅ API라는 사용자-서버가 통신하기 위한 인터페이스를 만든 뒤, 이를 웹 브라우저에서 테스트하려면 귀찮은 작업이 많다.

✅ 이를 편하게 해 주는 것이 포스트맨 이다!

 

✅ 01단계

https://www.postman.com/downloads/

 

Download Postman | Get Started for Free

Try Postman for free! Join 30 million developers who rely on Postman, the collaboration platform for API development. Create better APIs—faster.

www.postman.com

접속 후 운영체제에 맞게 다운로드 받기. (필자는 Silicon Mac을 사용 중)

 

 

✅ 02단계

다운로드 받은 파일을 여는데, lightweight API Client를 누른다.

 

저기 아래 작게 써진 글씨 누르면 된다.

✅ 03단계

확인 결과, 필자는 create a request 버튼이 따로 뜨지 않았고, 바로 다음 단계로 자동으로 넘어왔다.

주소 입력 창 옆에 GET이 있는데, 이는 HTTP 메서드 중 하나 이다.

✅ HTTP 메서드 : GET, POST, PUT 등등

✅ GET는 서버로부터 정보를 요청하기 위한 메서드이다.

 

0.4 예제 코드 저장소 위치와 저자에게 깃허브 이슈로 질문하기

 

✅ 01단계

https://github.com/shinsunyoung/springboot-developer-2rd

 

GitHub - shinsunyoung/springboot-developer-2rd: 📚 <스프링부트 3 백엔드 개발자 되기 2판> 예제코드

📚 <스프링부트 3 백엔드 개발자 되기 2판> 예제코드. Contribute to shinsunyoung/springboot-developer-2rd development by creating an account on GitHub.

github.com

 

이제 여기서 책의 내용을 따라하다 잘 안된다면 Issues -> New Issues를 눌러 이슈를 등록한다.

 

0.5 개발 편의와 속도를 확 올려줄 꿀 단축키

여기서는 필자가 새롭게 알게 된 단축키만 정리하고자 한다.

 

- 응용 필수 단축키

 
실행 ^ + R
디버그 모드로 실행 ^ + D
리팩터링 ^ + T
테스트 생성/이동 Cmd + Shift + T
사용하지 않는 임포트문 삭제 ^ + Option + O

 

- 타 IDE에서도 공통으로 사용되는 단축키

 
통합검색 double Shift
강조 표시로 된 오류/경고의 빠른 수정/개선 option + enter
최근에 연 파일 리스트 command + e
프로젝트 전체에서 코드 요소가 사용된 모든 위치 표시 option + F7

 

 

01장. 자바 백엔드 개발자가 알아두면 좋은 지식

1.1 서버와 클라이언트

✅ 클라이언트?

서버로 요청하는 프로그램을 모두 부르는 말

예시) 웹 브라우저

웹 브라우저로 주소를 입력한 뒤 엔터키를 누른다 -> 서버에 요청한다.

 

✅ 서버?

클라이언트의 요청을 받아 처리하는 주체

데이터를 요청할 수도 있고, 서버 내부에서 처리만 요청할 수도 있음.

예시) 웹 브라우저에 주소를 입력하는 것 -> 새로운 화면을 그리기 위한 데이터 요청, 즉 데이터 요청에 해당됨.

 

1.2 데이터베이스

데이터베이스?

여러 사람이 데이터를 한 군데 모아놓고 쓸 목적으로 관리하는 데이터 저장소

예시) MySQL, Oracle, postgreSQL

-> 사실 위의 예시들은 엄밀히 말하면 데이터베이스를 관리하는 프로그램(DBMS)임

클라이언트 -> SQL로 데이터베이스 조작을 위한 DBMS에 데이터 요청 -> DBMS는 DB로부터 Data를 꺼내 응답

 

✅ RDB?

데이터베이스는 RDB, NoSQL, NewSQL등으로 구분됨

그중 제일 많이 쓰는 것이 RDB (Relational DataBase) - 관계형 데이터베이스

RDB가 아닌 데이터베이스를 NoSQL, NewSQL이라 칭함.

RDB는 데이터를 행,열로 이루어진 테이블로 관리

Primary Key를 사용해 각 행을 식별

테이블 간의 관계 기정 가능

 

✅ SQL?

Structured Query Language이며, 쿼리(데이터)를 검색하는 언어

데이터 질의를 하기 위한 언어

 

✅ NoSQL?

원래는 No SQL, SQL을 안 쓴다는 의미이나, Not Only SQL로도 쓰이기도 함.

RDB는 데이터 저장, 삭제, 수정, 질의 등이 용이하나, 성능을 올리는 것이 쉽지 않음

이런 문제를 해결하기 위해 등장한 것이 NoSQL

데이터 모델링의 방법에 따라 DynamoDB, CouchBase, MongoDB등으로 나뉨.

 

1.3 아이피와 포트

IP는 인터넷에서 컴퓨터/기기들이 서로를 식별/통신하기 위한 주소

 하지만 서버 이용시 IP주소만으로 이용할 순 없음

포트까지 알아야 함

 

https://www.naver.com

여기서 www.naver.com은 ip주소 식별의 용이를 위해 이름표를 붙인 것이고, 

https://는 서버의 443번 포트를 사용하기 위한 입력임

 

1.4 라이브러리와 프레임워크

 라이브러리?

애플리케이션 개발에 필요한 함수, 클래스 등을 모아놓은 코드의 모음

개발자는 필요한 라이브러리를 의존성에 추가해 사용하기만 하면 됨.

라이브러리를 직접 구현하지 않아도 쓸 수 있음

라이브러리는 독립적이라 서로 영향을 크게 주진 않음

 

프레임워크?

프레임워크는 소프트웨어의 개발을 수월하게 하기 위한 소프트웨어 개발 환경

프레임워크는 정해진 틀에서 개발해야 하지만, 개발 효율은 매우 높다.

1.5 백엔드 개발자의 업무

1. 과제 할당

2. 과제 분석 - 제공 기능,성능, 사용 기술 등을 검토

3. 개발 - 기능 개발, 버그 수정

4. 테스트 - 로직 상 문제, 성능 한계 등을 검토/ 단위 테스트를 작성하게나, 테스트 주도 개발 기법을 사용하기도 함.

5. QA - Quality Assurance 진행, 애플리케이션 성능을 높이기 위함

6~7. 배포, 유지보수 - 롤링배포, 블루그린배포, 카나리배포 등의 방식을 이용해 배포.

빌드~배포까지의 반복과정을  자동화할 수도 있는데, 이를 CI/CD라 부름

1.6 백엔드 프로그래밍 언어

JAVA/Kotlin - 다양한 곳에서 사용

Python - 데이터 분석 뿐만 아니라 서버 개발에도 사용됨 (Flask, Django, Fast API)

JavaScript/TypeScript - 프론트엔드 / 백엔드 모두 사용 (Express, NestJS)

go

Rust

C++ - 성능이 중요한 게임 서버 개발에 많이 사용

C# - 국내보다는 미국에서 사용

1.7 자바 애너테이션

Java Annotation : 자바로 작성한 코드에 추가하는 표식

보통 @를 붙여 쓰고, JDK 1.5부터 사용

다양한 목적으로 사용되지만, 보통 메타 데이터로 사용하는 경우가 많음

Annotation Name Description
@Override 선언된 메서드가 오버라이드 되었음
@Deprecated 더이상 사용하지 않음
@SuppressWarnings 컴파일 경고 무시

 

02장. 스프링부트 3 시작하기

2.0 그림으로 이해하는 프로젝트

✅ TestController Class가 Web Browser의 요청을 받아 test()메서드를 실행하여 Hello, World!라는 문자열을 반환

 

2.1 스프링과 스프링부트

 

✅ 엔터프라이즈 애플리케이션 (Enterprise Application) : 대규모의 복잡한 데이터를 관리하는 애플리케이션

 소프트웨어 분야가 복잡해짐에 따라 엔터프라이즈 영역도 복잡해짐

 엔터프라이즈 애플리케이션은 수많은 유저의 요청을 동시에 처리해야 하므로 서버의 성능,안정성,보안이 매우 중요

 2003년 6월에 스프링 프레임워크 (Spring Framework) 탄생

 스프링은 장점이 많지만 설정이 매~~우 복잡하다. 이를 보완하고자 2013년 4월 스프링부트를 출시

스프링 부트 - 빠른 설정 가능, 의존성 세트라는 스타터를 사용해 간편하게 의존성 관리

가장 큰 차이는 모든 개발환경을 수동으로 구성해야 하는 스프링과 달리, 스프링 부트는 스프링 코어와 MVC (Module-View-Controller)를 자동으로 로드

또한 스프링부트는 WAS가 내장되어 있어 jar파일만으로도 실행 가능하다.

  스프링 스프링부트
목적 엔터프라이즈 애플리케이션 개발을 더 용이하게 스프링의 개발을 더 빠르고 용이하게
설정 파일 개발자가 수동으로 구성 자동 구성
XML 일부 파일은 XML로 직접 생성/관리 미사용
인메모리 데이터베이스 미지원 자동 설정 지원
서버 (WAS) 프로젝트를 띄우는 서버를 별도로 수동설정
예) 톰캣, 제티
내장형 서버 제공

 

2.2 스프링 콘셉트 공부하기

스프링의 제일 중요한 요소인 제어의 역전의존성 주입에 대해 알아본다.

제어의 역전 (IoC, Inversion of Control) : 

객체 생성을 위해 일반적으로 객체가 필요한 곳에서 생성.

예를 들어, 클래스 b의 객체를 사용하기 위해 클래스 A에서 직접 객체 생성

public class A {
	b = new B();
}

클래스 A 내부에서 new 키워드로 클래스 B의 객체 b 생성

 

제어의 역전은 외부에서 관리하는 객체를 가져와 사용하는 것.

실제 스프링은 스프링 컨테이너객체를 관리/제공하는 역할을 함.

public class A {
	private B b;
}

코드에서 객체 생성 없이 어디선가 받아온 객체를 b에 할당.

 

의존성 주입 (DI, Dependency Injection) : 어떤 클래스가 다른 클래스에 의존한다는 뜻.

public class A{
	@Autowired
    B b;
}

@Autowired라는 것은 Java Annotation, 스프링 컨테이너에 빈이라는 것을 주입하는 역할.

빈은 스프링 컨테이너에서 관리하는 객체

즉 여기서는 B b라고 선언만 했지, 객체를 생성하진 않음.

이게 왜 작동하냐....면! 스프링 컨테이너에서 객체를 주입했기 때문!

즉, DI를 이용해 스프링 컨테이너에서 생성한 객체를 

IoC를 이용해 외부에서 받아온 객체를 할당한다.

****완전 중요**** 밑줄쫙쫙 형광펜 별 다섯개

 

빈 : 스프링 컨테이너가 생성하고 관리하는 객체이다.

바로 위에서 봤던 조그만 객체 B가 빈(Bean)

스프링은 빈을 컨테이너에 등록하기 위해 XML 파일 설정, annotation 추가 등의 방법 제공

@Component
public class MyBean{

}

MyBean클래스에 @Component라는 annotation을 붙이면  MyBean클래스가 빈으로 등록된다!

이후에 스프링 컨테이너에서 이 MyBean을 관리하는데, 클래스명의 첫 글자를 소문자로 바꿔 관리한다. 즉, myBean이 됨

 

스프링 컨테이너 : 빈을 생성하고 관리한다. 즉, 빈이 생성되고 소멸되기까지의 생명주기를 관리한다. DI지원

관점 지향 프로그래밍 (AOP, Aspect Oriented Programming) : 프로그램에 대한 관심을 핵심,부가 관점으로 나눠서 관심 기준으로 모듈화 하는 것.

각각 계좌 이체와 고객관리 프로그램임.

각 프로그램에는 로깅 로직과 데이터베이스 연결 로직이 포함됨

여기서 핵심 관점은 계좌이체, 고객 관리 로직이고, 부가 관점은 로깅, 데이터베이스 연결 로직임

AOP는 부가 관점 코드를 핵삼 관점 코드에서 분리할 수 있게 해 준다.

 

이식 가능한 서비스 추상화 (PSA, Portable Service Abstraction) : 스프링에서 제공하는 다양한 기술들을 추상화해 개발자가 쉽게 사용하는 인터페이스

예) 클라이언트의 매핑과 클래스, 매서드의 매핑을 위한 annotation

스프링에서 데이터베이스에 접근하기 위한 기술 - JPA, MyBatis, JDBC 등

-> 어떤 기술을 사용하든 일관된 방식으로 데이터베이스에 접근하도록 인터페이스를 지원

 

2.3 스프링부트3 둘러보기

첫 번째 스프링부트 3 예제 만들기

01단계

TestController.java생성 후 내용 작성

코드를 쓰면서 뜨는 오류는 맥 기준 오류에 커서를 갖다대고, option + enter를 눌러 해결한다.

 

 02~03단계

응?

응???????

알고보니 패키지 아래에 클래스를 생성해야 하는데 모듈 아래에 생성했다...

잘못 위치한 클래스를 모듈 아래로 끌어다 주고, To Package를 눌러 (Make inner class of옵션 아님!) 패키지 안으로 옮겨 준다.

재실행 하면...

성공~❤️

 

여기서 이 애플리케이션은 어떻게 작동하는 것일까??

우리가 웹 브라우저(클라이언트)에서 보낸 /test라는 GET요청을 보면 된다.

http://localhost:8080/test에서

localhost127.0.0.1이고,

이는 컴퓨터 네트워크에서 사용하는 루프백 호스트명이다. a.k.a. 현재 사용하는 컴퓨터를 의미

8080포트번호

/test는 @GetMapping이라는 annotation이며, 메서드와 매핑할 때 스프링 부트에서 설정한 경로이다.

 

스프링부트 스타터 살펴보기

스프링부트 스타터? 의존성이 모여 있는 그룹이다.

스타터 명명 규칙 : spring-boot-starter-{작업유형}

예) JDBC 관련 스타터 : spring-boot-starter-jdbc

스타터명 설명
spring-boot-starter-web Spring MVC를 사용해서 RESTful 웹 서비스 개발 시 필요한 의존성 모음
spring-boot-starter-test 스프링 애플리케이션을 테스트 하기 위해 필요한 의존성 모음
spring-boot-starter-validation 유효성 검사를 위해 필요한 의존성 모음
spring-boot-starter-actuator 모니터링 위해 애플리케이션에서 제공하는 다양한 정보를 제공하기 쉽게 하는 의존성 모음
spring-boot-starter-data-jpa ORM을 사용하기 위한 인터페이스의 모음인 JPA를 더 쉽게 사용하기 위한 의존성 모음

 

✅ 01단계

프로젝트 로드/build.gradle 더블클릭

spring-boot-starter-web과 spring-boot-starter-test가 의존성으로 명시되어 있음

 

✅ 02단계

Gradle탭을 펼쳐 > Dependencies 항목 펼쳐 > compileClasspath 항목 펼쳐보기

이 스타터는 Spring MVC를 사용해 RESTful을 포함한 웹 어플리케이션을 개발하는 데 사용됨.

Tomcat도 포함됨.

 

✅ 03단계

testCompileClasspath 펼치기

왜 위의 compileClasspath와 똑같은 파일이 들어있는 것 같지..? 어쨌든 test 스타터도 확인

 

✅ 자동 구성

자동 구성은 스프링부트의 중요한 개념이다. 우리가 이걸 지금 알아야 하는 이유는 나중에 개발하다가 내가 구성하지 않고, 스프링에서 자동으로 구성한 파일들을 어떻게 확인하는지 알아야 하기 때문!

✅ 01단계

돋보기 > Files > spring-boot-autoconfigure/spring.factories 클릭 > 첫 번째 파일 클릭

그러면...

 

요렇게 엄청난 텍스트들이 날 반겨 준다. 이것이 프로젝트에 쓰일 구성 후보들이다.

처음 스프링 부트 시작 시 이 파일에 포함된 모든 클래스를 불러오고, 이후에는 프로젝트에서 사용할 것만 자동으로 구성해 등록해 놓는다.

 

✅ 02단계 

External Libraries > ...spring-boot-autoconfigure:x.x.x 찾기

 

저 클릭한 파일이 미리 구성된 자동 설정 파일이다.

자동 구성 클래스는 클래스명 + AutoConfiguration

속성값 정의 클래스는 클래스명 + Properties를 붙여놓았다

 

✅ 스프링부트3와 자바 버전

스프링 부트 3 이전과 이후에 사용할 수 있는 자바 버전 범위가 다르다!

 

즉, 스프링부트 2는 자바 8버전 이상을,

스프링부트 3은 자바 17버전 이상을 쓴다.

자바 17의 주요 변화인 텍스트 블록, 레코드, 패턴 매칭등을 알아보겠다.


✅ 텍스트 블록

여러 줄의 텍스트 작성 시 \n을 사용했지만, 이제는 """ 로 감싼 텍스트를 사용해 여러 줄의 텍스트를 표현할 수 있다.

String query11 = "SELECT * FROM \"items\"\n| +
	"WHERE \"status\" = \"ON_SALE\"\n" +
    "ORDER BY \"price\";\n";

String query17 = """
	SELECT * FROM "items
    WHERE "status" = "ON_SALE"
    ORDER BY "price";
    """;

암튼 가독성 짱짱

 

✅ formatted() 메서드

값을 파싱하기 위한 formatted()메서드도 제공함.

String textBlock17 = """
{
	"id" : %d
	"name" : %s,
}
""".formatted(2, "juice");

 

✅ 레코드

레코드는 데이터 전달을 목적으로 하는 객체를 더 빠르고 간편하게 만들기 위한 기능

레코드는 상속을 할 수 없고 파라미터에 정의한 필드는 private final 로 정의됨.

레코드는 getter를 자동으로 만들기 때문에 annotation이나 메서드로 직접 정의를 하지 않아도 됨.

record Item(String name, int price) {

}
Item juice = new Item("juice",3000);
juice.price();

 

✅ 패턴 매칭

타입 확인을 위해 사용하던 instanceof키워드를 조금 더 쉽게 사용할 수 있게 해줌

예전 : instance 키워드와 형변환 코드를 조합

지금 : 바로 형변환 이후에 사용 가능

 

//11버전
if(o instanceof Integer){
	Integer i = (Integer) o;
	... 생략 ...
}

//17버전
if(o instanceof Integer i){
	... 생략 ...
}

 

✅ 자료형에 맞는 css 처리

switch-case 문으로 자료형에 맞게 case 처리 가능

static double getIntegerValue(Object o){
	return switch (o){
    	case Double d -> d.intValue();
        case Float f -> f.intValue();
        case String s -> Integer.parseInt(s);
        default -> 0d;
    };
}

이번에는 스프링부트 3에서 변경되는 내용을 알아보겠다.

✅ Servlet, JPA의 name space가 Jakarta로 대체

package namespace가 javax.* 에서 jakarta.*로 변경됨

 

✅ GraalVM기반 스프링 네이티브 공식 지원

기존 자바 가상머신에 비해 훨씬 빠르게 시작됨, 더 적은 메모리 공간 차지

네이티브 이미지 사용 시 가동시간 짧아지고 메모리 적게 소모

 

2.4 스프링 부트 3 코드 이해하기

@SpringBootApplication 이해하기

✅ 01단계

SpringBootApplication.java 열기

✅ 이 클래스는 자바의 main()역할

✅ @SpringBootApplication annotation 사용 시 기본 설정 해줌

✅ SpringApplication.run() 은 애플리케이션 실행

✅ 첫 번째 인수 : 스프링부트 3 애플리케이션의 메인 클래스로 사용할 클래스

✅ 두 번째 인수 : 커맨드 라인의 인수들 전달

 

 

✅ 02단계

@SpringBootApplication을 command(ctrl)누른 상태에서 마우스 클릭 -> 구성 나타남

 

✅ SpringBootConfiguration

스프링 부트 관련 설정 나타내는 annotation

@Configuration을 상속해서 만든 annotation

 

✅ ComponentScan

사용자가 등록한 빈을 읽고 등록하는 annotation

용도에 따라 다른 annotation을 사용

annotation name description
@Configuration 설정 파일 등록
@Repository ORM 매핑
@Controller, @RestController 라우터
@Service 비즈니스 로직

 

✅ EnableAutoConfiguration

스프링부트에서 자동구성을 활성화하는 annotation

스프링부트 서버 실행 시 스프링부트 메타파일을 읽고 자동으로 설정구성

 

 

✅ 테스트 컨트롤러 살펴보기

빈이 어떻게 등록되는지 알아보자

/test GET 요청이 오면 test()메서드 실행

@RestController는 라우터 역할을 하는 annotation

여기서 라우터는 HTTP요청과 메서드를 연결하는 장치

이 annotation이 있어야 클라이언트의 요청에 맞는 메서드 실행 가능

여기서는 TestController를 라우터로 지정해 /test 라는 GET 요청 시 test()가 수행되게끔

여기서 어떻게 @RestController 와 @Component를 같은 것으로 취급할까?

 

✅ 01단계

@RestController를 command(ctrl)을 누른 채로 마우스를 클릭하면 RestController.java로 이동

@Controller annotation안에 @ResponseBody annotation이 합쳐진 결과물이 @RestController임을 알 수 있다.

그럼 @Component는 어디 있을까..?

 

✅ 02단계

@Controller 구현 파일로 이동

여기까지 오니 @Component annotation이 있다.

즉, @Controller annotation에서 @Component annotation을 갖고 있기 때문에,

@Controller annotation이 @ComponentScan을 통해 빈으로 등록이 된다.

 

이를 그림으로 그려봤는데,

(편의 상 다른 annotation들은 생략했다.)

이렇게 볼 수 있다. 끝!

반응형