Skip to content

[21기_박채연] spring tutorial 미션 제출합니다. #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: challonsy
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/gradlew text eol=lf
*.bat text eol=crlf
*.jar binary
43 changes: 43 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
*#
*.iml
*.ipr
*.iws
*.jar
*.sw?
*~
.#*
.*.md.html
.DS_Store
.attach_pid*
.classpath
.factorypath
.gradle
.metadata
.project
.recommenders
.settings
.springBeans
.vscode
/code
MANIFEST.MF
_site/
activemq-data
bin
build
!/**/src/**/bin
!/**/src/**/build
build.log
dependency-reduced-pom.xml
dump.rdb
interpolated*.xml
lib/
manifest.yml
out
overridedb.*
target
.flattened-pom.xml
secrets.yml
.gradletasknamecache
.sts4-cache

.idea
27 changes: 27 additions & 0 deletions HELP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Read Me First
The following was discovered as part of building this project:

* The original package name 'com.ceos21.spring-boot' is invalid and this project uses 'com.ceos21.spring_boot' instead.

# Getting Started

### Reference Documentation
For further reference, please consider the following sections:

* [Official Gradle documentation](https://docs.gradle.org)
* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/3.4.3/gradle-plugin)
* [Create an OCI image](https://docs.spring.io/spring-boot/3.4.3/gradle-plugin/packaging-oci-image.html)
* [Spring Web](https://docs.spring.io/spring-boot/3.4.3/reference/web/servlet.html)

### Guides
The following guides illustrate how to use some features concretely:

* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/)
* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/)
* [Building REST services with Spring](https://spring.io/guides/tutorials/rest/)

### Additional Links
These additional references should also help you:

* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)

79 changes: 78 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,79 @@
# spring-tutorial-21st
# WIL 1
CEOS back-end 21st spring tutorial project

## Spring Framework
시작하기 전 알면 좋을 개념

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오옹 이런 기본 개념부터 잡고 가는거 정말 좋은 것 같아요!

- **프레임워크 vs 라이브러리**
- 공통점: 이미 만들어진 것을 개발자가 사용한다
- 차이점: 프로그램의 제어권 여부(프레임워크 -> 코드 -> 라이브러리)
- **컨테이너란?**
- 어떤 환경에서든 코드를 실행할 수 있도록, 코드 실행에 필요한 모든 요소를 담아둔 소프트웨어 패키지.
코드는 물론 언어, 라이브러리 같이 종속적인 모든 항목을 포함한다.

### Spring 프레임워크란?
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Spring이 무엇인지 관련 개념과 비교해서 설명해주신 것이 인상 깊네요!
기본적인 개념이지만서도 간과하고 넘어갈 수 있는 부분을 짚어주셔서 좋은 것 같아요 :)

기업에서 자바 어플리케이션을 만들기 위해 사용할 수 있을 정도의 기술을 포함하고 있는 프레임워크.
- 자바 플랫폼
- 경량(과도한 엔지니어링 없이 단순한 환경에서 사용 가능)

#### Spring Boot vs Spring
기존에는 다소 복잡했던 스프링 프레임워크의 의존성 설정이나 버전 관리, 빈 등록, 배포 등을 더 쉽게 할 수 있도록 도와주는 프레임워크가 Spring Boot 이다.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오히려 기본이어서 넘어가는 부분이었는데 잘 잡아주셔서 좋은 것 같아요! 잘 읽고 갑니다

### Spring이 지원하는 기술들
- IoC/DI
- 제어의 역전: 스프링 컨테이너가 빈으로 등록된 객체의 생명 주기를 관리한다.
- 의존성 주입: 어떤 객체를 이용해야 할 때, 내부에서 선언, 생성하는 것이 아니라 스프링이 외부에서 주입해줌.
- AOP
- 어떤 코드들이 사용하는 공통적인 로직이 있을 때 이 코드들을 모아서 필요한 곳에 공통으로 적용 가능
- PSA
- 여러 서비스를 묶어서 하나로 추상화하는 것. 이 때문에 내부 전략이 바뀌더라도 이를 신경쓰지 않아도 된다.
- 예를 들어 `@Transactional` 어노테이션을 사용할 때 데이터베이스와 연결 시 JDBC, JPA 중 어느것을 사용하든 해당 어노테이션의 내부적 구현을 바꾸지 않고 사용 가능하다.
사용자의 선언에 따라 의존성을 주입받기 때문이다.
- POJO
- Java 스펙에 기술되지 않은 다른 기술을 사용하지 않고 순수한 자바 코드만으로 작성한 오브젝트.
- 이를 위해 위의 IoC/Di, AOP 등의 기술을 지원한다.


## Spring Bean
앞서 일반적인 컨테이너에 대해 설명해두었는데, 스프링 컨테이너에 대해 더 자세히 알아보자.

스프링 컨테이너란 `ApplicationContext`라는 인터페이스를 일컫는다. 즉, 자바 코드 내에서 객체로 선언하고 구현체를 생성할 수 있다.
이 인터페이스의 구현체를 생성할때 빈들 간의 관계를 정의한 config 파일(xml 등)을 넘겨주는데, 이곳에 정의된 메타 정보(데이터의 스펙)를 읽으면서 '스프링 컨테이너'가 된다.

context 객체는 xml 파일을 읽으면서, 파일 내 정의된 객체를 생성하고 관리하게 된다. `getBean` 메소드를 통해 객체를 전달할 수 있다.

이 때 xml 파일에 정의되어 스프링 컨테이너가 관리하게 된 자바 객체를 **빈** 이라고 한다.

### 스프링 빈의 생명 주기
`스프링컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 전 콜백 -> 스프링 종료`
이 때, 생성자로 의존성을 주입 받는다면 객체 생성과 동시 의존 관계가 주입된다.
그렇지 않고 setter 등으로 의존 관계를 주입 받는다면 객체를 먼저 생성하고, 그 후에 의존성을 주입한다.
- 초기화 콜백

## Spring Annotation
### 어노테이션이란?
코드 자체의 기능을 변경하는 것이 아니라, 해당 코드의 메타 정보에 추가적인 정보를 제공하면서
런타임에 특정 기능을 실행하도록 알려주는 일종의 메타 데이터이다.

각 어노테이션은 또 다른 어노테이션을 포함하고 있을 수 있고, 어노테이션을 직접 만들 수도 있다.

### 종류
매우 많다. `@Controller`, `@Service`, `@Bean` 등의 어노테이션이 있다. 각 어노테이션들은 다른 어노테이션을 포함하고 있을 수도 있는데, `@Component` 어노테이션을 포함하고 있는 어노테이션들은 빈으로 등록될 수 있다.

### Bean 등록 과정
`@ComponentScan`어노테이션은 `@Component` 어노테이션이 포함되어있는 어노테이션을 자동으로 스캔하여 해당 객체를 빈으로 등록한다.
Comment on lines +59 to +63

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

어노테이션 종류에 대해 잘 알아봐주셨네요! 혹시 어노테이션을 직접 등록할 수도 있다는 사실 알고 계신가요?! 같이 한 번 알아보면 좋을 것 같아요~

https://velog.io/@thing-zoo/Spring-Bean%EC%9D%84-%EC%88%98%EB%8F%99%EC%9C%BC%EB%A1%9C-%EB%93%B1%EB%A1%9D%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95


이 전에는 xml 파일에 패키지 경로를 입력하여 정의했지만 어노테이션을 사용하면 자바 파일에서 스캔할 수 있다.



## 단위 테스트와 통합 테스트
### 단위 테스트
격리된 환경에서 필요한 부분만 모의 객체를 모아서 빠르고 효율적으로 테스트를 진행한다.
서비스, 레포지토리, 도메인, 또는 코드 별 테스트를 작성할 수 있다.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

단위 테스트도 여러 가지 스타일로 작성하는 것 같은데, 저는 given-when-then 방식으로 작성합니다!
https://mangkyu.tistory.com/144
여기에 자세히 나와있으니 한번 보시면 좋을 것 같아요!

실제 테스트하려는 클래스와 의존 관계에 있는 다른 객체들은 가짜 객체로 대체하여 진행한다.
### 통합 테스트
어플리케이션의 전체 컨텍스트를 가져와 실제 동작 환경과 유사한 환경에서 테스트를 진행한다.

시스템 바깥의 다른 외부 시스템과의 연동 상태도 점검 가능하다.

38 changes: 38 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.3'
id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.ceos21'
version = '0.0.1-SNAPSHOT'

java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

//jpa
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

//lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

//h2
runtimeOnly 'com.h2database:h2'
}

tasks.named('test') {
useJUnitPlatform()
}
7 changes: 7 additions & 0 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading