본문 바로가기
Memo/우테코 4기

[우테코] @MVC 프레임워크 구현 미션 학습 로그

by 연로그 2022. 10. 1.
반응형

 


1. 요구사항 ✨

자세한 미션 요구사항 및 수행 내역은 깃허브 레포지토리에 branch 별로 분류해두었습니다.

 

GitHub - yeon-06/jwp-dashboard-mvc

Contribute to yeon-06/jwp-dashboard-mvc development by creating an account on GitHub.

github.com

 

 

 나만의 @MVC 프레임워크를 만들어보자. 이전 미션에서 HTTP 서버를 만들고 Controller 인터페이스를 활용해 MVC 프레임워크를 구현했다. 그런데 MVC 프레임워크 영역과 비즈니스 로직을 작성하는 영역이 분리되어있지 않다. 비즈니스 로직 구현에만 집중 할 수 있도록 어노테이션 기반의 MVC 프레임워크로 개선해보자.

 

 


2. 학습 내역 🔮

 

💜 DispatcherServlet

  • DispatcherServlet이란?
  • DispatcherServlet의 역할
  • Spring 까보기

👉 https://yeonyeon.tistory.com/275

 

[Spring] DispatcherServlet

1. DipatcherSevlet이란? 🌺 🌱 Dipatcher란? dispatch: 보내다 dispatcher: (열차, 버스 등이 정시 출발하도록 관리하는) 운행 관리원 🌱 Servlet이란? 웹 서버 내에서 실행되는 작은 Java 프로그램 일반적으로 H.

yeonyeon.tistory.com

 

 

💜 Reflection을 이용해 Field의 값 가져오기

// object: field를 갖고 있는 객체
// field: object를 이용해 가져온 필드. object.getClass().getDeclaredFields(); 등을 통해 꺼낼 수 있다.

public Object findFieldValue(final Object object, final Field field) {
    try {
        field.setAccessible(true);
        return field.get(object);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}
  • setAccessible: true로 설정하면 Java 언어 액세스 제어(ex: 접근제어자)에 대한 검사를 방지
  • get: 인자로 주어진 object에서 field의 값을 가져옴 (null값이 반환될 수 있음)
참고: Java docs

 

 

💜 @Inject vs @Autowired

  • Inject
    • java 6부터 도입된 어노테이션
  • Autowired
    • Spring에서 제공하는 어노테이션
    • required vs optional 의미를 추가 (ex: @Autowired(required = false)

 

This is an alternative to the JSR-330 Inject annotation, adding required-vs-optional semantics.
- 출처: Spring Docs

 

 


3. 추가 미션 🍂

 

🧡 Reflection 활용하기

👉 https://github.com/yeon-06/jwp-hands-on/pull/4

 

[220915] Reflection 활용하기 by yeon-06 · Pull Request #4 · yeon-06/jwp-hands-on

학습 순서 Junit3TestRunner 클래스의 모든 테스트를 통과시킨다. Junit4TestRunner 클래스의 모든 테스트를 통과시킨다. ReflectionTest 클래스의 모든 테스트를 통과시킨다. ReflectionsTest 클래스의 모든 테스

github.com

 

🧡 DI 활용하기

 DI container를 구현할 때 Reflection을 활용해 필드의 값들을 주입할 때 했던 생각이다. 3단계에서는 모든 필드들을 긁어와 해당 값들을 채워줘야했다. 다만 모든 필드들을 긁어오는 과정에서 static final로 선언되어있던 Logger나 상수 등 주입하지 않아도 되는 이미 초기화된 필드들도 불러와졌고 이 부분을 어떻게 해결할지 고민했다.

 

 완벽한 조치는 아니지만 해당 필드에 값이 존재하는지에 따라 필드를 초기화해주었다. null 값이 담겨있다면 DI Container에 등록한 다른 객체에서 해당 필드와 타입이 맞는 인스턴스를 주입시켜줬다. 헌데 이 방법도 맹점이 있었다. 단지 null 값을 갖고 있었을 뿐이지 DI Container를 통해 주입시켜야 할 필드가 아니라면? 이 경우에는 어떻게 판별할 수 있지? 그래서 생성자를 통해 초기화시키는 필드들만 가져와 주입시키는 방법을 생각해보았지만 구현이 너무 복잡해졌다.

 

 4단계에서 이 부분에 대한 고민은 해결되었다. 어노테이션이 달린 필드만 주입시키면 된다. 예전에 스프링의 의존성 주입 방식에 대해 공부할 때 @Autowired는 자동으로 생략된다해서 왜 그러는거지? 라는 의문을 가진 적이 있는데 이런 맥락이었구나를 깨닫게 되었다.

 

👉 https://github.com/yeon-06/jwp-hands-on/pull/5

 

[220927] DI 활용하기 by yeon-06 · Pull Request #5 · yeon-06/jwp-hands-on

학습 순서 DI 컨테이너로 변화하는 과정을 코드로 학습하자. di 모듈의 테스트 코드에 di 패키지가 있다. stage0부터 stage2까지 변화 과정은 강의에서 설명 stage3, stage4의 테스트 코드가 정상 동작하

github.com

 

반응형