[21기_박정하] spring tutorial 미션 제출합니다.#1
[21기_박정하] spring tutorial 미션 제출합니다.#1mirupio wants to merge 2 commits intoCEOS-Developers:mirupiofrom
Conversation
There was a problem hiding this comment.
첫 과제 수행하시느라 고생 많으셨습니다!
혹시 스프링 튜토리얼(https://grand-substance-c20.notion.site/199489107d2881ad9fdce27f354a750d?p=1b1489107d28807a8f2cd8dd8056e119&pm=s) 도 진행한걸까요?
하셨다면 관련 파일들도 함께 PR 날려주세요~
|
|
||
| 2. **Singleton 기본 적용** | ||
| - Spring Container 내에서 하나의 Bean은 하나만 생성됨 | ||
| - 기본 설정 : @Scope("singleton"), 필요하면 변경 가능 : @Scope("prototype") |
There was a problem hiding this comment.
와아 singleton에 대한 내용을 함께 조사해주셨군요! @Scope("singleton")과 @Scope("prototype")의 차이는 무엇이 있나요?
There was a problem hiding this comment.
두 어노테이션은 Bean의 생성범위에서 차이가 있는데요! 각 특징을 정리해보았씁니다..
-
@scope("singleton")
- Spring의 기본 스코프(Default Scope)
- Bean이 한 번만 생성되어 Spring 컨테이너 내에서 공유됨
- 같은 Bean을 여러 번 주입받아도 항상 같은 인스턴스를 참조
- 메모리 사용량이 적고 성능이 좋음, 하지만 상태를 가지면 동시성 문제 발생 가능
-
@scope("prototype")
- 요청할 때마다 새로운 객체를 생성
- 각 요청마다 독립적인 Bean 인스턴스를 반환
- 상태 정보를 가지는 Bean을 사용할 때 유용
- 하지만 매번 새 인스턴스를 생성하므로 메모리 사용량이 증가
따라서 singleton은 공유할 수 있는 stateless 객체에 적합하고, prototype은 각 요청마다 새로운 인스턴스가 필요할 때 적합합니다!
| - DisposableBean 인터페이스 구현 -> destroy() 메서드 호출 | ||
| -> 애플리케이션 종료 시, Bean이 소멸되기 전 정리할 작업 수행 | ||
|
|
||
| ## Spring annotation |
| = @Componet 계열 어노테이션 사용 | ||
| - @Component, @Service, @Repository, @Controller 등 사용 -> 자동 Bean 등록 | ||
|
|
||
| 2. **Java Config** |
There was a problem hiding this comment.
어노테이션 기반 자동 등록과 비교했을 때, `@Bean을 사용했을 때의 장점이 뭐가 있을까요?
There was a problem hiding this comment.
Bean을 사용했을 때의 장점은 여러가지가 있습니다..
- 외부 라이브러리 객체 등록 가능
- @component는 내부에서 만든 클래스에만 적용할 수 있지만, @bean은 외부 라이브러리에서 제공하는 클래스도 직접 등록할 수 있음.
ex) JDBC datasource
- @component는 내부에서 만든 클래스에만 적용할 수 있지만, @bean은 외부 라이브러리에서 제공하는 클래스도 직접 등록할 수 있음.
- 세밀한 설정 가능
- @component는 기본 생성자나 @Autowired를 통한 자동 주입을 해야하지만, @bean은 직접 객체를 생성하고 세부 설정을 조정할 수 있음.
- 생성 순서 및 의존성 명확하게 관리 가능
- @component 스캔 방식에서는 클래스 간의 의존성이 복잡할 경우 순서를 명확히 보장하기 어렵지만, @bean을 사용하면 필요한 Bean을 메서드 호출을 통해 직접 전달할 수 있음
한마디로 "간편한 것은 @component이지만 세밀한 커스텀을 위해서는 @bean을 사용한다"라고 보면 될 것 같습니다!
There was a problem hiding this comment.
@seoahS01
스프링 튜토리얼도 올렸습니다......바보같이 readme만 제출해야하는 건줄 알고 있었어요 ㅠ.ㅠ....죄송합니다
| 3. **Lazy Initialization 가능** | ||
| = 필요할 때만 생성됨 | ||
| - 기본 설정 : Container가 로드될 때 Bean 미리 생성, 필요하면 변경 가능 : @Lazy -> 생성 미룸 |
There was a problem hiding this comment.
지연로딩과 즉시로딩 차이가 뭔가요?!
N+1 문제에 대해서도 공부하면 좋을 것 같아요!
There was a problem hiding this comment.
둘은 JPA에서 연관된 엔티티를 조회할 때 언제 데이터를 불러올 것인지를 결정합니다.
-
즉시 로딩(Eager Loading)
fetch = FetchType.EAGER (기본값: @manytoone, @OnetoOne)- 연관된 엔티티를 즉시 조회하는 방식
- 엔티티를 조회하면 연관된 모든 엔티티를 한 번에 가져옴
-
지연 로딩(Lazy Loading)
fetch = FetchType.LAZY (기본값: @onetomany, @manytomany)- 실제 데이터를 사용할 때까지 연관된 엔티티를 조회하지 않음
- N+1 문제
- 지연 로딩으로 인해 발생하는 성능 문제
- 하나의 쿼리(N)에 대해 추가적으로 N개의 쿼리가 실행됨
ex) Order 엔티티를 조회할 때 Customer 엔티티가 지연 로딩일 경우 => Order마다 추가적으로 Customer를 가져오는 N개의 추가 쿼리 발생
잘 몰랐던 개념인데 정리하면서 새롭게 알게 되었어요!! 질문 감사합니다 ㅎㅎ
| #### 2. 의존성 주입 | ||
| - @Autowired, @Inject, @Resource 사용 | ||
| -> 의존성 자동 주입 |
There was a problem hiding this comment.
이 세개의 차이점이 뭔가요 !
각각이 Bean을 찾는 순서에 대해서도 찾아보면 좋을 것 같네요 ~!
저도 잘 몰라서 찾아봤습니당 ㅎㅎ
https://wooj-coding-fordeveloper.tistory.com/68
There was a problem hiding this comment.
셋의 차이를 정확하게 정리해준 아주 유용한 글이군요...! 좋은 자료 감사합니당 ㅠ.ㅠ
정리하자면... 세가지 경우에 따라서 알맞게 선택해서 쓰면 될 것 같네요! ㅎㅎ
- Spring 전용 프로젝트
→ @Autowired (Spring의 추가 기능 지원 가능) - Spring이 아닌 다른 프레임워크와 호환 필요
→ @Inject (Java 표준) - 특정 이름의 빈을 지정해야 할 때
→ @resource(name = "beanName")
| #### 개념 | ||
| - Java에서 메타데이터를 제공하는 특수한 형태의 마커 | ||
|
|
||
| #### 구현 방식 | ||
| - **컴포넌트 스캔** : @Controller, @Service, @Repository (는 @Component 포함) -> spring bean으로 자동 등록 | ||
| - Spring container라는 '통'에 @Controller붙은 것들을 '컨트롤러 객체'로 생성해서 넣어둠 | ||
| - Spring container라는 '통'에 @Service붙은 것들을 '서비스 객체'로 생성해서 넣어둠 | ||
| - Spring container라는 '통'에 @Repository붙은 것들을 '리포지토리 객체'로 생성해서 넣어둠 | ||
| - **자동 의존관계 설정** : 생성자에 @Autowired 붙어 있으면 spring container에 있는 객체와 연결시켜줌 | ||
|
|
||
|
|
||
| ## 단위 테스트와 통합 테스트 | ||
| ### 단위 테스트 Unit Test | ||
| #### 개념 | ||
| - 애플리케이션의 **개별 모듈**(클래스, 메서드 단위)만을 테스트 | ||
| - 다른 모듈과의 의존성을 제거(Mocking) 하여 독립적으로 테스트 | ||
|
|
||
| #### 존재 이유 | ||
| - **빠르고 독립적**이므로 **주요 기능 검증**하는 데 유용 | ||
|
|
||
| ### 통합 테스트 Integration Test | ||
| #### 개념 | ||
| - **여러 모듈**(서비스, 컨트롤러 등)이 실제로 연동되는지 테스트 | ||
| - 데이터베이스, API, 파일 시스템 등과의 실제 연동 확인 | ||
|
|
||
| #### 존재 이유 | ||
| - **실제 환경과 유사**하게 동작을 검증하는 데 필요 |
| #### 1. 객체 생성 | ||
| - @Component, @Bean 사용 | ||
| -> Spring이 Bean을 자동 생성 | ||
|
|
There was a problem hiding this comment.
@component와 @bean 의 차이점을 처음에는 몰라서 찾아본 적이 있는데, Component는 class 단위로 Bean은 메서드 단위로 한다고 해요! (아마 다 아실 것 같지만요 ㅎ)
There was a problem hiding this comment.
오 그 기준으로 나뉜다는 것은 뭔가 들어본 것 같으면서도 잊고 있었어요...!! ㅎㅎ 감사합니당ㅎ
| #### 3. 초기화 | ||
| - @PostConstruct 또는 init-method 속성 사용 | ||
| - InitializingBean 인터페이스 구현 -> afterPropertiesSet() 메서드 호출 | ||
| -> Bean이 생성된 후 실행할 초기화 로직을 수행 |
There was a problem hiding this comment.
저는 빈 라이프 사이클을 초기화 / 사용 / 소멸 정도로만 찾아봤는데 각 구현 및 로직과 함께 명시 해 주어서 더 좋은 것 같아요
| ## Spring annotation | ||
| #### 개념 | ||
| - Java에서 메타데이터를 제공하는 특수한 형태의 마커 | ||
|
|
There was a problem hiding this comment.
처음에 메타 데이터가 무엇인지 감이 잘 안 잡혔는데
https://kr.teradata.com/glossary/what-is-metadata
에서 보니까 확실히 알 것 같더라고요! 참고 자료 남깁니다 :)
There was a problem hiding this comment.
오 저도 감이 안 왔는데 이제 좀 알 것 같아요...ㅎㅎ
다른 데이터를 설명하는 데이터였군요...!! 감사합니당 !!!
No description provided.