스프링 부트3 - 들어가기

김동헌·2023년 11월 6일
0

SpringBoot

목록 보기
3/19
post-thumbnail

파일 구조


📌 @GetMapping

@GetMapping 애너테이션
ip주소 : 포트번호 / 경로를 이용해서 홈페이지를 사용하게 되는데 localhost:8080/test를 하게 될 때, @GetMapping를 이용해 해당 경로와 스프링 부트 프로젝트에서 작성한 메서드를 매핑할 수 있다.

SpringBootDeveloperApplication Code

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);
    }
}

TestController

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-webSpring MVC를 사용해서 RESTful 웹 서비스를 개발할 때 필요한 의존성 모음
spirng-boot-starter-test스프링 애플리케이션을 테스트하기 위해 필요한 의존성 모음
spring-boot-starter-validation유효성 검사를 위해 필요한 의존성 모음
spring-boot-starter-actuator모니터링을 위해 애플리케이션에서 제공하는 다양한 정보를 제공하기 쉽게 하는 의존성 모음
spring-boot-starter-data-jpaORM을 사용하기 위한 인터페이스의 모음인 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


☄️ 자바 17의 주요 변화

스프링 부트3Java version 17 ↑ 사용 가능
주요 변화텍스트 블록, 레코드, 패턴 매칭


🔨 텍스트 블록

이전에는 여러 줄의 텍스트를 작성하려면 텍스트 끝에 \n을 추가했지만,
이제는 """로 감싼 텍스트를 사용해 여러 줄의 텍스트를 표현할 수 있게 되었다.

"""로 여러 줄의 텍스트 표현

String queryEx = "SELECT * FROM \"student"\n" +
	"WHERE \ "grade\" = \"A\"\n";

변경

String queryEx = """
	SELECT * FROM "student"
    WHERE "grade" = "A";
    """;

🔨 formatted() Method

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) {
	// 생략
}

🔨 Jakarta

Servlet, JPA의 네임 스페이스가 Jakarta로 대체 됨
패키지 네임 스페이스가 javax.*jakarta.*로 변경


🔨 스프링 네이티브 공식지원

스프링 애플리케이션을
네이티브 이미지로 컴파일해 JVM에 구동되는 애플리케이션에 비해
시작 시간과 메모리 오버 헤드를 줄일 GraalVM 기반의 스프링 네이비티를 공식 지원

JVM 실행 파일과 비교해 네이티브 이미지를 사용하면 가동 시간이 짧아지고, 메모리를 더 적게 소모한다.


📌 코드 이해하기

☄️Application Code

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을 알아보려고 한다. 이 세가지의 애너테이션이 스프링 부트의 특징이므로 추후에 도움이 될 것이다.


🔨 @SpirngBootConfig

@@SpirngBootConfiguration

스프링 부트 관련 설정을 나타내는 애너테이션으로 @configuration을 상속해서 만든 애너테이션이다. 이 애너테이션은 개발자가 직접 사용하는 애너테이션은 아니다.


🔨 @ComponentScan

사용자가 등록한 빈을 읽고 등록하는 애너테이션이다.
이 애너테이션은 @Component라는 애너테이션을 가진 클래스를 찾아 빈으로 등록한다.
단, 모든 빈에 @Component만 사용하는건 아니다.
@Component를 감싸는 애너테이션이 있는데 실제 개발을 하면 @Component 애너테이션 보다는 용도에 따라 다른 애너테이션을 사용하므로 관련 애너테이션은 알아두면 좋다.

애너테이션 이름설명
@Configuration설정 파일 등록
@RepositoryORM 매핑
@Controller
@RestController
라우터
@Service비즈니스 로직

🔨 @EnableAutoConfig

@EnableAutoConfiguration

스프링 부트에서 자동 구성을 활성화하는 애너테이션
스프링 부트 서버가 실행될 때 스프링 부트의 메타 파일을 읽고 정의된 설정들을 자동으로 구성하는 역할을 수행한다.
spring.factories 파일의 클래스들이 모두 @EnableAutoConfiguration을 사용할 때 자동 설정된다.


☄️ TestController

@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 애너테이션을 갖고 있다.

profile
백엔드 기록 공간😁

0개의 댓글