들어가기 앞서
** 지난 주 스터디는 추석으로 휴강했기 때문에 이번 스터디 wil.md 파일은 week3 폴더에 제출해주셔야 제출로 체크 된다고 합니다!! **
이번 주 스터디도 수고 많으셨습니다!
이번 스터디에서는 스프링 빈과 어플리케이션 컨텍스트에 대해 정리해보았는데요, 이번 주 내용을 간단하게 요약하면 다음과 같습니다.
스프링 빈 = 어플리케이션 전역에서 공통으로 사용하는 하나의 객체
스프링 컨테이너 = 스프링 빈을 저장하는 공용 저장 공간
의존성 주입 = 필요한 빈을 프레임워크가 대신 넣어주는 것
컨테이너에 빈 등록(저장)하는 방법 : 컴포넌트 스캔, 설정 파일 작성
의존성 주입을 받는 방법 : 생성자 주입, 필드 주입, 메서드 주입
스프링 계층 구조 : 컨트롤러 <-> 서비스 <-> 레포지토리 <-> DB
WIL 을 작성하실 때 다음 내용을 위주로 정리해보시면 좋을 것 같아요!
이 내용들은 인터넷에 검색해보시면 많은 사람들이 잘 정리해두었으니 같이 보면서 정리하셔도 좋습니다!
•
스프링 빈과 스프링 컨테이너의 개념
•
스프링 빈을 컨테이너에 저장(등록)하는 방법
•
의존성 주입 (DI) 개념과 스프링에서 의존성을 주입하는 방법
혹시 이와 관련된 내용을 좀 더 깊이 있게 학습하고 싶으시다면, 인프런에서 김영한 님의 스프링 핵심 원리 - 기본편 강의를 들어보시길 추천드립니다.
과제
목표
•
스프링 빈과 컨테이너의 개념 이해하기
•
스프링 빈을 컨테이너에 등록하는 방법 이해하기
•
컨테이너에 등록된 스프링 빈을 가져오는 방법 이해하기
제출해야 할 파일과 파일 경로
1.
2.
스프링의 계층 구조에 맞춰 MyController, MyService, MyRepository 클래스를 만들어 빈으로 등록하고, 의존성을 주입해봅니다.
하단의 예제 코드도 함께 참고해주세요 :)
a.
폴더 구조 명세를 참고하여 main 디렉토리 하위에 hw 패키지를 만들고, 그 안에 MyController, MyService, MyRepository 클래스를 생성합니다.
- 각 클래스는 모두 컴포넌트 스캔 방식을 사용하여 빈으로 등록해주세요.
- MyController 는 MyService에 의존하고, MyService 는 MyRepository에 의존합니다.
각 의존성은 롬복을 사용하여 생성자 주입 방식으로 의존성을 주입해주세요.
(롬복은 @RequiredArgsConstructor, @Getter 등을 제공하는 라이브러리입니다.)
- MyRepository 는 “repository”를 출력하는 public 메서드를 갖습니다.
- MyService 는 “service” 를 출력하고, 위에서 작성한 MyRepository의 메서드를 호출하는 public 메서드를 갖습니다.
- MyController 는 “controller” 를 출력하고, 위에서 작성한 MyService의 메서드를 호출하는 public 메서드를 갖습니다.
b.
폴더 구조 명세를 참고하여 test 디렉토리 밑에 hw 패키지를 만들고 테스트 클래스를 생성합니다.
테스트 클래스에는 @SpringBootTest 어노테이션을 사용하고, 필드 주입 방식으로 MyController 빈을 주입 받아주세요.
- 테스트 메서드에서 주입 받은 MyController 객체의 public 메서드를 호출해주세요. (예시 코드 참고)
- 테스트 실행 결과를 스크린샷으로 찍어 wil.md 파일에 추가해주세요.
(실행 결과 예시 참고)
폴더 구조 명세 (예시)
week3/
└── wil.md
└── 테스트 실행결과 스크린샷 이미지
todoapi/
└── main/
└──── java/
└────── com.example.todoapi/
└──────── hw/
└────────── MyController.java
└────────── MyService.java
└────────── MyRepository.java
└── test/
└──── java/
└────── com.example.todoapi/
└──────── hw/
└────────── MyControllerTest.java
YAML
복사
MyController, MyService, MyRepository 참고용 예시
class MyController {
private MyService myService;
public void controllerMethod() {
System.out.println("contoller");
myService.serviceMethod();
}
}
Java
복사
class MyService {
private MyRepository myRepository;
public void serviceMethod() {
System.out.println("service");
myRepository.repositoryMethod();
}
}
Java
복사
class MyRepository {
public void repositoryMethod() {
System.out.println("repository");
}
}
Java
복사
메서드 이름은 자유롭게 지어주셔도 괜찮습니다.
이 코드는 참고용 코드입니다. 이렇게 그대로 작성하기만 하면 스프링 빈으로 등록해서 사용한 게 아니라 제대로 동작하지 않을 거에요.
이 코드를 참고하여 각 클래스를 컴포넌트 스캔 방식을 사용하여 빈으로 등록하고, 생성자 주입 방식으로 의존성을 주입해주세요.
혹시 참고용 코드를 보셔도 과제 명세가 이해가 안되시거나 궁금한 점이 있으시면 편하게 DM 주세요!
테스트 함수 예시
@Test
public void controllerTest() {
myController.controllerMethod();
}
Java
복사
myController 객체는 필드 주입 방식으로 주입 받아서 사용합니다.
직접 new 로 객체를 생성해서 호출하시면 안됩니다!
테스트 실행 결과 예시
Starting Gradle Daemon...
Gradle Daemon started in 7 s 510 ms
> Task :compileJava
> Task :processResources
> Task :classes
> Task :compileTestJava
> Task :processTestResources NO-SOURCE
> Task :testClasses
00:54:01.889 [Test worker] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [com.example.todoapi.homework.MyControllerTest]: MyControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
00:54:02.213 [Test worker] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration com.example.todoapi.TodoApiApplication for test class com.example.todoapi.homework.MyControllerTest
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.3.2)
2024-09-19T00:54:03.710+09:00 INFO 33420 --- [todo-api] [ Test worker] c.e.todoapi.homework.MyControllerTest : Starting MyControllerTest using Java 17.0.9 with PID 33420 (started by everdu in D:\Hongik Univ\GDSC\2024-2-backend-study)
2024-09-19T00:54:03.716+09:00 INFO 33420 --- [todo-api] [ Test worker] c.e.todoapi.homework.MyControllerTest : No active profile set, falling back to 1 default profile: "default"
2024-09-19T00:54:07.129+09:00 INFO 33420 --- [todo-api] [ Test worker] c.e.todoapi.homework.MyControllerTest : Started MyControllerTest in 4.322 seconds (process running for 8.32)
controller
service
repository
Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
> Task :test
BUILD SUCCESSFUL in 1m 41s
4 actionable tasks: 4 executed
오전 12:54:10: Execution finished ':test --tests "com.example.todoapi.homework.MyControllerTest.myControllerTest"'.
Shell
복사
@SpringBootTest 를 사용한 테스트라서 이렇게 스프링 부트 로고가 올라와야 정상입니다.
controller, service, repository 객체를 직접 new 해서 생성한 적이 없음에도 controller, service, repository 가 순서대로 출력되면 성공입니다!
마감 기한
다음주 수요일 10/2 23:59까지 제출해주세요.
** 지난 주 스터디가 추석으로 휴강해서 이번 스터디의 wil.md 파일은 week3 폴더에 제출해주셔야 제출로 체크 된다고 합니다!! 제출하실 때 폴더명을 꼭 확인해주세요!! **
제출 방법
자신의 레포지토리에 week3 폴더를 생성해 wil.md 파일을 제출합니다.
더 자세한 사항은 아래 링크를 참조해주세요.