인프런에서 주최하는 Warming-up 클럽 0기 백엔드 스터디에 참여하고 있다.
스터디에 참여하면서 배우게 된 내용을 전체적으로 정리하고, 참여하면서 느낀 부분을 회고해 보고자 한다.
(1) 13일 차 : 2024-03-06(Wed)
1. build.gradle
(1) 빌드 스크립트라고도 불리며 gradle을 통해 프로젝트를 빌드하고 프로젝트에 필요한 의존성을 관리할 수 있다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.2'
id 'io.spring.dependency-management' version '1.1.4'
}
1-1. plugins : 'org.springframework.boot'
(1) 플러그인을 추가할 수 있으며, 플러그인은 스프링을 빌드했을 때 실행 가능한 .jar 파일이 생성되도록 도와준다.
(2) 스프링 애플리케이션의 실행을 돕고 기타 여러 가지 플러그인들이 잘 적용될 수 있게 설계되어 있다.
1-2. plugins : io.spring.dependency-management
(1) 외부 라이브러리나 프레임워크들의 버전을 관리하고 서로 얽혀있는 의존성을 처리하는 역할을 수행한다.
1-3. 프로젝트 관련 설정
group = 'com.group' // 프로젝트 그룹 정보
version = '0.0.1-SNAPSHOT' // 프로젝트의 버전
java {
sourceCompatibility = '17' // 사용되는 JDK version
}
(1) 프로젝트의 버전을 수정하면 빌드 결과물인 .jar 파일에도 수정 버전이 반영된다.
(2) sourceCompatibility의 경우 JDK의 버전이 명시되어 있다.
1-4. repositories
repositories {
mavenCentral()
}
(1) 외부 라이브러리 / 프레임워크를 가져올 수 있는 장소를 선정한다.
(2) mavenCentral()의 경우 라이브러리나 프레임워크를 가져올 때 maven 중앙 저장소에서 가져온다는 의미이다.
1-5. dependencies
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client:3.0.9' // MariaDB JDBC 드라이버 추가
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
(1) 의존성을 관리하는 영역인데, implementation은 해당 의존성을 항상 사용한다는 것이고, rumtimeOnly의 경우 코드를 실제로 실행할 때에만 해당 라이브러리나 프레임워크를 사용한다는 것
(2) testImplementation은 테스트 코드를 컴파일하거나 실행 시 항상 사용한다.
(3) 이렇게 사용할 라이브러리나 프레임워크(의존성)을 관리하는 것을 Dependency Configuration이라고 한다.
(4) org.springframework.boot:spring-boot-starter-data-jpa
- JPA를 스프링 프레임워크와 함께 사용하기 위한 모든 의존성의 집합
(5) org.springframework.boot:spring-boot-starter-web
- 스프링으로 웹 개발을 하기 위한(내장 톰캣 등) 다양한 도구들의 집합
(6) org.springframework.boot:spring-boot-starter-test
- 스프링으로 테스트 진행(테스트 코드)을 위한 라이브러리, 프레임워크(의존성)의 집합
1-6. 테스트 수행 시 JUnit5 사용
tasks.named('test') {
useJUnitPlatform()
}
(1) JUnit5는 자바나 코틀린 프로젝트를 할 때 자주 사용되는 테스트 프레임워크로 테스트 코드 작성 시 사용된다.
2. Spring, Spring Boot 차이
(1) Java EE(기업 레벨에서 애플리케이션을 개발하기 위한 기반 기술들, 좋은 기술은 아니였음)으로 서버 개발을 진행
(2) 이후 2004년에 Spring 1.0 등장
(3) Spring 1.0에서 XML 설정 간소화, Java 5 지원 시작
(4) Spring 3.0에서 자바 어노테이션 기반의 설정이 확대, Java 6 지원
(5) Spring 4.0에서 Java 8 지원, Groovy DSL 활용, Web Socket 지원
(6) 2014년 4월 Spring Boot 1.0 등장,
(7) Spring Boot 5.0 등장 : Java 9, Java Reactive programming 지원
(8) 2017년 11월 Spring Boot 2.0
(9) Spring 6.0
(10) 2022년 1월, Spring Boot 3.0 등장
2-1. 스프링 부트는 기존 스프링과 무엇이 다를까?
(1) 간편한 설정 제공
- 스프링 컨테이너, 의존성 주입뿐만 아니라 트랜잭션과 같은 웹 애플리케이션 개발에 사용되는 다양한 기술들을 추상화, AOP과 같은 기술을 통해 어노테이션이 잘 동작하도록 해주는 등 이런 강력한 기능들을 사용하기 위해 XML 설정을 많이 해 주어야 했고 이 과정이 상당히 번거로웠다. (XML 설정에 대해 알아야 하는 기반 지식, 설정이 길고 복잡했다)
- 이러한 문제를 해결하기 위해 XML 대신, 스프링 부트에서는 자바 기반의 어노테이션을 이용한 설정을 적극적으로 사용하도록 했고 개발자가 필요한 설정을 모두 해 주는 것이 아니라 자동으로 설정되도록 설계했다.
(2) 간단한 의존성 관리
- 기존 스프링을 사용할 때에는 개발에 필요한 의존성(라이브러리, 프레임워크)를 모두 명시해야 했다. 사람이 적는 것이다 보니, 라이브러리, 프레임워크끼리의 Conflict이 빈번하게 발생했다.
- 스프링 부트가 starter를 사용해서 필요한 의존성들과 버전을 모두 관리해서 처리해 주고 있다.
(3) 강력한 확장성
(4) MSA에 적합한 모니터링
3. application.yml, application.properties, Lombok library
(1) application.yml, application.properties 모두 스프링 부트 프로젝트를 기준으로 애플리케이션의 설정 정보를 정의하기 위한 파일이다.
3-1. application.yml
(1) YML(Yet Another Markup Language)
- 또 다른 마크업 언어라는 의미
- 확장자 : .yml, .yaml
- Key:value 타입으로 구성되고 들여쓰기로 구분되는 계층구조를 가진다.
3-2. application.properties
(1) 큰 차이는 key=value 타입이지만 계층구조가 아니라는 점이다.
3-3. Lombok 라이브러리
(1) getter, setter, 생성자와 같이 반복되는 Boiler plate code를 제거할 수 있는 라이브러리이다.
(2) @NoArgsConstructor - Default Constructor 생성
(3) @RequiredArgsConstructor - final, NotNull 기반 필드들을 대상으로 생성자를 생성한다.
4. 개인 회고
(1) 스프링으로 개발을 하면서 단순히 의존성을 관리해주는 도구인 줄 알았던 build.gradle과 스프링, 스프링 부트의 차이에 대해 정리할 수 있었다. 스프링 부트가 많은 것을 추상화해줌으로써 개발자가 더 편리하게 스프링을 사용할 수 있다는 부분을 다시 한 번 인지했다.
5. Reference
(1) 관련 레퍼런스는 인프런에서 활동하고 계시는 최태현 강사님의 온라인 강의를 듣고 내용을 정리했습니다.
※ 해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.
개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있으며, 이에 대해 댓글로 알려주시면 감사하겠습니다
'기록, 회고 > InFlearn Warming-up 0기 BE' 카테고리의 다른 글
[12일 차] - 내용 정리(배포를 위한 명령어, 배포 진행), 개인 회고 (0) | 2024.03.04 |
---|---|
[11일 차] - 내용 정리(배포, Git 기초 사용 방법, AWS EC2), 개인 회고 (0) | 2024.03.02 |
[10일 차] - 내용 정리(JPA와 연관 관계, 지연 로딩(객체지향적 설계)), 개인 회고 (0) | 2024.02.28 |
[9일 차] - 내용 정리(추가된 기능에 대한 API 개발), 개인 회고 (2) | 2024.02.27 |
[8일 차] - 내용 정리(트랜잭션, JPA 영속성 컨텍스트), 개인 회고 (0) | 2024.02.26 |
댓글