파일 구조
@GetMapping
애너테이션
ip주소 : 포트번호 / 경로를 이용해서 홈페이지를 사용하게 되는데localhost:8080/test
를 하게 될 때,@GetMapping
를 이용해 해당 경로와 스프링 부트 프로젝트에서 작성한 메서드를 매핑할 수 있다.
package my.travel.springbootdeveloper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootDeveloperApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDeveloperApplication.class, args);
}
}
package my.travel.springbootdeveloper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@GetMapping("/test")
public String test() {
return "Hello, World";
}
}
실행한 뒤에 주소창에
localhost:8080/test
를 입력하면 아래와 같이 뜰 것이다 !
스프링 부트 스타터는 의존성이 모여 있는 그룹이다. 이 그룹을 이용해 필요한 기능을 간편하게 구현할 수 있다.
단 사용할 때 스타터의 명명규칙을 따라야한다.
명명규칙 :srping-boot-starter-{작업유형}
필요한 기능을 찾았다면 해당 스타터를 쉽게 찾을 수 있다 !
예로, JDBC 관련 스타터는spring-boot-starter-jdbc
이다.자주쓰는 스타터
스타터 설명 spring-boot-starter-web Spring MVC를 사용해서 RESTful 웹 서비스를 개발할 때 필요한 의존성 모음 spirng-boot-starter-test 스프링 애플리케이션을 테스트하기 위해 필요한 의존성 모음 spring-boot-starter-validation 유효성 검사를 위해 필요한 의존성 모음 spring-boot-starter-actuator 모니터링을 위해 애플리케이션에서 제공하는 다양한 정보를 제공하기 쉽게 하는 의존성 모음 spring-boot-starter-data-jpa ORM을 사용하기 위한 인터페이스의 모음인 JPA를 더 쉽게 사용하기 위한 의존성 모음
위의 예제에서는
spring-boot-starter-web
,spirng-boot-starter-test
스타터를 이용하였다.그렇다면 위 두개의 스타터에 어떤 의존성들이 있는지 확인해보자.
IDE 오른쪽 코끼리를 선택하고Dependencies
를 펼친다 !
스프링 부트는 현재 버전에 맞는 라이브러리를 알아서 관리한다.
스프링 공식 Devenpency Version 문서
https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-starters스타터 종류 참고(깃허브)
https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-starters
스프링 부트3
→ Java version 17 ↑
사용 가능
주요 변화
→ 텍스트 블록
, 레코드
, 패턴 매칭
이전에는 여러 줄의 텍스트를 작성하려면 텍스트 끝에 \n
을 추가했지만,
이제는 """로 감싼 텍스트를 사용해 여러 줄의 텍스트를 표현할 수 있게 되었다.
"""로 여러 줄의 텍스트 표현
String queryEx = "SELECT * FROM \"student"\n" +
"WHERE \ "grade\" = \"A\"\n";
변경
String queryEx = """
SELECT * FROM "student"
WHERE "grade" = "A";
""";
Java version 17
이하의 버전은 매우 불편한 방법으로 값을 파싱했지만
17버전 이상부터는 formatted()
를 사용해 간편하게 파싱할 수 있다.
파싱을 위한 Formatted() 예
String textBlock = """
{
"id": %d
"name" : %s,
}
""".formatted(2, "book");
레코드는 데이터 전달을 목적으로 하는 객체를 빠르고 간편하게 만드는 기능
레코드는 상속할 수 없고, 파라미터에 정의한 필드는 private final
로 정의된다.
또한 레코트는 게터(getter)를 자동으로 만들기 때문에 애너테이션이나 메서드로 게터 정의를 하지 않아도 된다.
레코드 사용 예
record Item(String name, int price) {
// 파라미터는 private final로 정의
}
Item Juice = new Item("SpringBoot", 30000);
SpringBoot.price(); //30000
타입 확인을 위해 사용하던 instanceof 키워드를 더 쉽게 사용할 수 있는 패턴 매칭
이전에는 instanceof 키워드와 형변환 코드를 조합했지만 이제는 바로 형변환을 사용할 수 있다.
instanceof 키워드 사용 예
// 기존
if (o instanceof Integer) {
Integer i = (Integer) o;
// 생략
}
// 수정
if (o instanceof Integer i) {
// 생략
}
Servlet
, JPA
의 네임 스페이스가 Jakarta
로 대체 됨
패키지 네임 스페이스가 javax.*
→ jakarta.*
로 변경
스프링 애플리케이션을
네이티브 이미지로 컴파일해 JVM에 구동되는 애플리케이션
에 비해
시작 시간과 메모리 오버 헤드를 줄일 GraalVM 기반의 스프링 네이비티를 공식 지원
JVM 실행 파일과 비교해 네이티브 이미지를 사용하면 가동 시간이 짧아지고, 메모리를 더 적게 소모한다.
package my.travel.springbootdeveloper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootDeveloperApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDeveloperApplication.class, args);
}
}
public class SpringBootDeveloperApplication
는 자바의 Main() 메서드 역할
@SpringBootApplication
애너테이션을 추가하면 스프링 부트에 필요한 기본 설정을 해준다.
SpringApplication.run()
메서드는 애플리케이션을 실행한다. 첫번째 인수는 스프링 부트 3 애플리케이션의 메인 클래스로 사용할 클래스, 두번째 인수는 커맨드 라인의 인수들을 전달한다.
조금 더 깊게 들어가보자.
IDE에서 애너테이션(@SpringBootApplication
)을 Ctrl
누른 상태로 클릭하면 관련 구성이 나오게 된다.
되게 많은 설명들이 있는데 그 중 SpringBootConfiguration
, ComponentScan
, EnableAutoConfiguration
을 알아보려고 한다. 이 세가지의 애너테이션이 스프링 부트의 특징이므로 추후에 도움이 될 것이다.
@@SpirngBootConfiguration
스프링 부트 관련 설정을 나타내는 애너테이션으로
@configuration
을 상속해서 만든 애너테이션이다. 이 애너테이션은 개발자가 직접 사용하는 애너테이션은 아니다.
사용자가 등록한 빈을 읽고 등록하는 애너테이션이다.
이 애너테이션은@Component
라는 애너테이션을 가진 클래스를 찾아 빈으로 등록한다.
단, 모든 빈에@Component
만 사용하는건 아니다.
@Component
를 감싸는 애너테이션이 있는데 실제 개발을 하면@Component
애너테이션 보다는 용도에 따라 다른 애너테이션을 사용하므로 관련 애너테이션은 알아두면 좋다.
애너테이션 이름 설명 @Configuration
설정 파일 등록 @Repository
ORM 매핑 @Controller
@RestController
라우터 @Service
비즈니스 로직
@EnableAutoConfiguration
스프링 부트에서 자동 구성을 활성화하는 애너테이션
스프링 부트 서버가 실행될 때 스프링 부트의 메타 파일을 읽고 정의된 설정들을 자동으로 구성하는 역할을 수행한다.
spring.factories
파일의 클래스들이 모두@EnableAutoConfiguration
을 사용할 때 자동 설정된다.
@RestController
public class TestController {
@GetMapping("/test")
public String test() {
return "Hello, World";
}
}
이 코드에서 빈이 어떻게 등록되는지 알아보자.
@RestController
는 라우터 역할을 하는 애너테이션이다. 라우터는 HTTP 요청과 메서드를 연결하는 장치이다.
아까 인터넷 주소창에 localhost:8080/test를 입력하면 Hello, World가 출력 되었는데 TestController가 하나의 라우터로 /test GET 요청이 오게되면 test() 메서드를 실행하고, test() 메서드의 내용 Hello, World가 출력된 것이다.
아까
@Component
가 사용자가 등록한 빈을 읽고 등록한다고 했다. 그런데 용어가 다른데 어떻게 같은@Component
로 취급해 빈이 등록되는 것일까 ?
@RestController
애너테이션에 Ctrl
을 눌러 들어가보자.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller // (1)
@ResponseBody // (2)
public @interface RestController {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
* @since 4.0.1
*/
@AliasFor(annotation = Controller.class)
String value() default "";
}
코드를 보면
@Controller
,@ResponseBody
애너테이션이 함께 있다. 즉,@Controller
+@ResponseBody
=@RestController
으로 볼 수 있다.하지만, 아직
@Component
가 없는데@Controller
에 들어가보자.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component // ! ! !
public @interface Controller {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
*/
@AliasFor(annotation = Component.class)
String value() default "";
}
코드를 다시 보면
@Component
애너테이션이 있다.
이러한 코드로@Controller
애너테이션이@ComponentScan
을 통해 빈으로 등록된다.
@Controller
애너테이션에서@Component
애너테이션을 갖고 있기 때문이다.앞에 용도에 따른 애너테이션이 여러개인데 빈으로 등록되는 이유들도 모두
@Component
애너테이션을 가지고 있기 때문이다.
@Component
애너테이션이 있는 클래스는 빈으로 등록되며,@Controller
,@RestController
,@Configuration
,@Repository
,@Service
들은 모두@Component
애너테이션을 갖고 있다.