본문 바로가기

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

[2024 Spring Boot 스터디] 김호 #1 주차 - Spring Boot 3 알아보기 (0 ~ 2장)

반응형

1. 인텔리제이(IntelliJ) 설치 및 개발 환경 구축

 스프링 부트 실습을 위해 자바(Java) IDE인 인텔리제이를 설치한다.

 

1-1. JDK(Java Development Kit) 버전 설정

 JDK 버전은 교재에 나온 17 버전으로 설정한다. 17 버전으로 설정해야 추후 formatted() 메서드나 instanceof 등의 키워드를 8 버전에 비해 편리하게 사용할 수 있다.

 

1-2. 그레이들(Gradle) 설정

 

 그레이들 DSL(Domain Specific Language)을 Groovy로 설정한다.

 

1-3. 의존성(Dependency) 추가

build.gradle

 

 plugins 블록 내에 스프링 부트 플러그인 'org.springframework.boot'와 스프링의 의존성을 자동 관리하는 'spring.dependency-management' 구문을 추가한다. 또한 dependencies 블록 내에 웹 관련 기능을 제공하는 'spring-boot-starter-web'과 테스트 기능을 제공하는 'spring-boot-starter-test' 구문을 추가한다.

 

1-4. 패키지(Package) 및 클래스(Class) 생성

 [그룹 이름].[프로젝트 이름] 형식의 패키지를 생성 후, 해당 패키지에 [프로젝트 이름][Application] 형식의 클래스를 생성한다.

 

1-5. static/index.html 파일 생성

index.html

 

 요청이 전달되었으나 대응하는 페이지가 존재하지 않아서 나오는 404 오류 페이지를 해결하기 위해, [resource] 디렉토리에 [static/index.html] 디렉토리의 파일을 추가한다. 그 다음 html의 기본 코드를 입력하여 정상적으로 동작하도록 한다.

 

1-6. 포스트맨(Postman) 설치

 

 포스트맨은 API 개발 시 간단한 절차로 API 기능을 테스트할 수 있는 프로그램이다. 따라서 본 프로그램을 설치해둔다.

 

2. 백엔드(Backend) 기본 지식

2-1. 서버(Server) & 클라이언트(Client)

 클라이언트는 서버로 요청을 전송하는 프로그램이며, 서버는 클라이언트로부터 수신한 요청을 처리하는 기능을 담당한다. 

2-2. 데이터베이스(Database)

 데이터베이스는 다수의 사용자가 데이터를 한 곳에 저장하는 동시에 데이터를 사용할 목적으로 관리하는 데이터 저장소이다. 흔히 데이터베이스로서 언급되는 MySQL, 오라클(Oracle), 포스트그레SQL(PostgreSQL) 등은 엄밀히 데이터베이스가 아니며, 데이터베이스를 관리하기 위한 시스템의 이름이다. 다만 해당 관리 시스템은 데이터베이스와 한 쌍으로 동작하므로 하나로 묶여 언급된다. 

 데이터베이스는 RDB(Relational Database), NoSQL, NewSQL 등 여러 종류가 존재하며, RDB가 가장 많이 사용된다.

 

2-2-1. RDB(Relational Database)

 RDB, 즉 관계형 데이터베이스는 데이터를 행과 열로 구성된 테이블로 관리하며, 기본키를 통해 각 행을 식별한다. RDB에서 가장 유명한 데이터베이스에는 오라클, MySQL, SQL 서버, 포스트그레SQL이 있다.

 

2-2-2. SQL(Structured Query Language)

 SQL은 데이터를 검색하는 언어이며, 여러 종류가 존재한다.

 

2-2-3. NoSQL(Not Only SQL)

  RDB 데이터베이스의 성능 문제를 해결하기 위해 개발된 비관계형 데이터베이스 유형이다. 데이터 모델링에 따라 다이나모디비(DynamoDB), 카우치베이스(Couchbase), 몽고디비(MongoDB) 등의 다양한 데이터베이스로 나뉜다.

 

2-3. 아이피(IP) & 포트(Port)

 아이피는 인터넷 상의 장치들 간의 식별 및 통신을 위해 정의된 주소이며, 포트는 서버에서 운용 중인 서비스를 구분하기 위한 번호이다. 따라서 서버 이용시 아이피와 포트를 알아야 한다. 본 실습에서는 임의의 사용자 정의 포트인 8080을 사용한다.

 

2-4. 라이브러리(Library) & 프레임워크(Framework)

 라이브러리는 미리 구현된 코드의 모음이며, 개발자가 복잡한 코드를 직접 구현하지 않고도 라이브러리를 통해 필요한 기능을 원활하게 개발할 수 있도록 한다.

 

 프레임워크는 개발하기 위한 틀을 제공하는 개발 환경이며, 정해진 틀에서 개발하게 함으로써 개발 효율을 높인다.

 

2-5. 백엔드 개발자의 업무

 백엔드 개발자는 일반적으로 과제 할당 → 과제 분석 → 개발 → 테스트(리뷰) → QA 및 버그 수정 → 배포 → 유지보수 순서로 업무를 진행한다.

 

2-6. 백엔드 프로그래밍 언어 

 백엔드 개발에 자주 사용되는 언어에는 파이썬, 자바와 코틀린(Kotlin), C++와 C#, 그리고 자바스크립트(JavaScript) 등이 쓰이고 있다.  

 

2-7. 자바 애너테이션(Java Annotation)

 애너테이션은 자바 코드 위에 추가하는 표식이며 @ 기호를 사용한다. 애너테이션은 주로 메타 데이터로써 사용된다. 예컨대 선언된 메서드가 오버라이드 되었음을 명시할 때 @Override 애너테이션을 사용한다.

 

3. 스프링(Spring) 개념

3-1. 제어의 역전(Inversion of Control) & 의존성 주입(Dependency Injection)

 스프링에서 임의의 클래스 내에 다른 객체를 직접 생성하지 않고 스프링 컨테이너에서 받아오는 기법이다. 제어의 역전을 적용하기 위해 의존성 주입이라는 방식을 사용한다. 이때 스프링 컨테이너(Spring Container)가 빈(Bean)을 생성하고 관리한다.

3-2. 스프링 컨테이너(Spring Container) & 빈(Bean)

 빈은 스프링 컨테이너가 생성하고 관리하는 객체이다. 앞서 서술한 스프링 컨테이너에서 주입받는 또 다른 객체가 빈이다.

 

 빈을 스프링 컨테이너에 등록하기 위해 XML 파일 설정 및 에너테이션 추가 등의 방법을 사용한다. 가령 MyBean이라는 public 클래스가 있고, 본 클래스 위에 @Component 에너테이션을 추가하면 빈으로 등록되며, 클래스명의 앞 글자를 소문자로 변환함으로써 빈 이름으로 취급된다.

3-3. 관점 지향 프로그래밍(Aspect Oriented Programming)

 프로그램을 핵심 관점과 부가 관점으로 나누어 모듈화하는 방식이다. 부가 관점 코드를 핵심 관점 코드에서 분리할 수 있도록 한다. 따라서 개발 시 핵심 관점 코드에만 집중할 수 있으며 프로그램의 유연한 유지보수를 가능하게 한다.

3-4. 이식 가능한 서비스 추상화(Portable Service Abstraction)

 스프링에서 제공하는 다양한 기술들을 추상화(Abstraction)하여 개발자가 쉽게 사용할 수 있는 인터페이스이다. 대표적으로 매핑과 클래스, 에너테이션 기법이 있다. 본 기법은 어느 기술을 사용하든 일관된 방식으로 처리할 수 있다는 장점이 있다.

4. 스프링 부트 3(Spring Boot 3)

 스프링 부트는 설정하는 데 

4-1. 스프링 부트 스타터(Starter)

 스프링 부트 스타터는 스프링 의존성의 집합이다. 스타터를 통해 필요한 기능을 간편하게 설정할 수 있다. 스타터는 spring-boot-starter-{작업유형} 형식의 명명 규칙이 존재하며, 이 규칙에 따라 필요한 기능에 맞는 스타터를 쉽게 찾을 수 있다.자주 사용하는 작업 유형에는 web, test, validation, actuator, jpa가 있다.

4-2. 자동 구성(Auto Configure)

 자동 구성 기능은 스프링 부트에서 애플리케이션이 최소한의 설정만으로도 실행되게 여러 부분을 자동으로 구성하도록 한다. 스프링 부트는 서버 시작 시 META-INF에 위치한 spring.factories 파일에 담긴 자동 설정을 통해 서버에 대한 설정을 적용한다.

 

 

 실제로 spring-boot-autoconfigure/spring.facories를 검색하면 해당 파일의 내용을 확인할 수 있다.

 

 

 또한 External Libraries 탭에서 spring-boot-autoconfigure:x.x.x 디렉토리를 보면 META-INF 디렉토리를 발견할 수 있다.

 

 

 가령 미리 구현된 자동 설정 파일 중 h2 디렉토리를 살펴보면 자동 구성된 클래스는 AutoConfigutation, 속성값을 정의한 클래스는 Properties를 클래스명 끝에 붙였음을 확인할 수 있다.

 

4-3. 텍스트 블록

 JDK 설정 단계에서 서술했 듯이 자바 버전에 따라 스프링 부트에서 사용할 수 있는 기능의 문법이 다르다. 우선 텍스트 블록 문법에서 여러 줄의 텍스트를 작성하려면 '\n'을 추가해야 했으나, 자바 17 버전부터 """로 여러 줄의 텍스트를 감싸 비교적 편리하게 작성할 수 있다.

String old = "\"Hello"\n"+
"World!\"";

String enhanced = """
"Hello
World!"
""";

 

4-4. formatted() 메서드

 또한 자바 17 버전부터 값을 파싱하는 데 사용하는 formatted() 메서드가 추가되었다. 이전 버전에서는 해당 메서드가 없어 불편한 방식으로 값을 파싱해야 했다.

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

 

4-5. 레코드(Record)

 레코드는 데이터 전달을 목적으로 하는 객체를 더 빠르고 편리하게 작성할 수 있도록 하는 기능이다. 레코드는 상속 불가능하며 파라미터에 정의한 필드는 private final 키워드로 정의된다. 특히 레코드는 게터(Getter)를 자동으로 생성하여 따로 정의할 필요가 없다.

record Item(String name, int price){
	...
}
Item apple = new Itme("apple", 1000);
apple.price();

 

4-6. 패턴 매칭: instanceof

 패턴 매칭은 타입 확인을 위해 사용하던 instanceof 키워드를 더 간편하게 사용할 수 있다. 이전에는 instanceof 키워드와 형변환 코드를 조합해야 했으나 17 버전부터 바로 형변환을 사용할 수 있다.

// old ver.
if (obj instanceof Integer){
	Integer i = (Integer) obj;
}

// new ver.
if (obj instancof Integer i){
	...
}

 

4-7. @SpringBootApplication 애너테이션

 @SpringBootApplication 에너테이션은 스프링 부트의 핵심 에너테이션으로, 대표적으로 다음과 같은 에너테이션으로 구성되어있다.

 1. @SpringBootConfiguration: 스프링 부트 관련 설정을 나타내는 에너테이션.

 2. @ComponentScan: 사용자가 등록한 빈을 읽고 등록하는 에너테이션.

 3. @EnableAutoConfiguration: 스프링 부트에서 자동 구성을 활성화하는 에너테이션.

 

4-8. 테스트 컨트롤러(Test Controller)

 스프링 컨테이너를 통해 빈이 어떻게 등록되는지 테스트 컨트롤러를 통해 알 수 있다. 예제로 작성한 TestController.java를 살펴보면, 클래스 선언문 위에 @RestController 에너테이션이 존재한다.

TestController.java

 

 @RestController는 라우터 역할을 하며 클라이언트이 요청에 맞는 메서드를 실행할 수 있도록 한다.

@RestController를 Ctrl + 마우스 클릭을 통해 RestController.java를 보면,

RestController.java

 @Controller 및 @ResponseBody 에너테이션의 조합이 @RestController 에너테이션임을 확인할 수 있다. 여기서 또한 Controller.java를 보면,

Controller.java

 @Component 에너테이션을 확인할 수 있다. 따라서 @Controller 에너테이션이 @Component 에너테이션을 포함하고 있으므로, @Controller 에너테이션이 @ComponentScan을 통해 빈으로 등록됨을 알 수 있다.

반응형