Service
home
WOW Onboarding
home
🧩

[초급 백엔드 스터디 2회차 과제]

들어가기 앞서

** 지난 주 스터디는 추석으로 휴강했기 때문에 이번 스터디 wil.md 파일은 week3 폴더에 제출해주셔야 제출로 체크 된다고 합니다!! **
이번 주 스터디도 수고 많으셨습니다! 이번 스터디에서는 스프링 빈과 어플리케이션 컨텍스트에 대해 정리해보았는데요, 이번 주 내용을 간단하게 요약하면 다음과 같습니다.
스프링 빈 = 어플리케이션 전역에서 공통으로 사용하는 하나의 객체
스프링 컨테이너 = 스프링 빈을 저장하는 공용 저장 공간
의존성 주입 = 필요한 빈을 프레임워크가 대신 넣어주는 것
컨테이너에 빈 등록(저장)하는 방법 : 컴포넌트 스캔, 설정 파일 작성 의존성 주입을 받는 방법 : 생성자 주입, 필드 주입, 메서드 주입
스프링 계층 구조 : 컨트롤러 < - > 서비스 < - > 레포지토리 < - > DB
이번 2회차 과제는 스프링 어플리케이션의 계층 구조를 껍데기 클래스로 만들어 봅니다.
이 과제를 완료하시면 4, 5, 6 회차에 진행하는 내용은 이번 과제로 작성한 클래스의 안 쪽을 채우는 과정이라는 걸 이해하실 수 있을 거에요.
WIL 을 작성하실 때 다음 내용을 위주로 정리해보시면 좋을 것 같아요! 이 내용들은 인터넷에 검색해보시면 많은 사람들이 잘 정리해두었으니 같이 보면서 정리하셔도 좋습니다!
스프링 빈스프링 컨테이너의 개념
스프링 빈을 컨테이너에 저장(등록)하는 방법
의존성 주입 (DI) 개념과 스프링에서 의존성을 주입하는 방법
혹시 이와 관련된 내용을 좀 더 깊이 있게 학습하고 싶으시다면, 인프런에서 김영한 님의 스프링 핵심 원리 - 기본편 강의를 들어보시길 추천드립니다.

과제

목표

스프링 빈과 컨테이너의 개념 이해하기
스프링 빈을 컨테이너에 등록하는 방법 이해하기
컨테이너에 등록된 스프링 빈을 가져오는 방법 이해하기

제출해야 할 파일과 파일 경로

1.
wil.md 파일에 이번 주 학습 내용, 느낀 점 등을 자유롭게 정리해주세요. (wil은 꼭 week3 폴더에 담아주세요!)
2.
스프링의 계층 구조에 맞춰 MyController, MyService, MyRepository 클래스를 만들어 빈으로 등록하고, 의존성을 주입해봅니다. 하단의 예제 코드도 함께 참고해주세요 :)
a.
폴더 구조 명세를 참고하여 main 디렉토리 하위에 hw 패키지를 만들고, 그 안에 MyController, MyService, MyRepository 클래스를 생성합니다. - 각 클래스는 모두 컴포넌트 스캔 방식을 사용하여 빈으로 등록해주세요. - MyControllerMyService에 의존하고, MyServiceMyRepository에 의존합니다. 각 의존성은 롬복을 사용하여 생성자 주입 방식으로 의존성을 주입해주세요. (롬복은 @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 폴더에 제출해주셔야 제출로 체크 된다고 합니다!! 제출하실 때 폴더명을 꼭 확인해주세요!! **

제출 방법