✏️ 2022-12-23 Today I Learn

@mitoconcrete · December 23, 2022 · 8 min read

[TodayKeywords] 오늘 공부한 키워드

  • 디자인패턴의 종류 : 객체지향의 디자인 패턴은 큰 구분으로 생성, 구조, 행위의 목적으로 나뉘어진다. 생성의 경우에는 어떤 객체를 잘 생성하기 위한 것이다. 구조는 객체들을 모아 어플리케이션의 구조를 효율적으로 구성하기 위한 것이다. 행위는 객체간 어떤 행위 즉, 알고리즘이나 책임분배등을 위해 사용한다. 각각의 구분 하에는 다양한 패턴들이 있다.
  • Bean : 스프링의IoC(Inversion Of Control) 컨테이너에서 관리하는 클래스들이다. 싱글톤 패턴으로 관리되기 때문에, 어디에서 사용하나 같은 객체를 참조한다.
  • @Component : 커스텀 빈을 선언 할 때, 사용하는 어노테이션이다.
  • @Bean : 이것을 통해 선언한 것은 빈으로 관리되며, @Component 를 포함하고 있다. 주로 외부라이브러리들을 가져와 IOC컨테이너 에 등록할 때 사용한다.
  • @ 의 의미 : 컴파일러에게 일을 시키는 주석이다.
  • 어노테이션의 종류 : 자바에 내장된 내장(Built-in)어노테이션, 사용자 정의하여 사용하는 커스텀 어노테이션, 커스텀어노테이션을 만들기위해 사용하는 메타 어노테이션이 있다.
  • @Target : 메타어노테이션이며, 해당 어노테이션이 어디에 쓰일지 정의해준다. (필드, 파라미터, 클래스, 컨스트럭터 등등..)
  • @Retention : 메타어노테이션이며, 해당 어노세이션이 어느시점에 쓰일지 정의해준다. 소스코드시점, 클래스시점, 런타임시점으로 나뉜다.
  • Reflection API : 컴파일 시, static 영역에 있는 클래스 정보를 이용하여, 런타임 때 사용가능하게 만들어준다. 평상시에는 잘쓰지않지만, 라이브러리를 개발하거나, 라이브러리를 사용할 때 사용한다고한다.

[NextKeyworks] Study Queue

  • HTTPS
  • SOLID
  • loop label
  • CSV
  • 파일입출력
  • UML
  • UTC
  • epoch time / Instant time
  • MVC
  • URL ClassLoader
  • Secure ClassLoader
  • JNI
  • GC
  • HOF
  • 자바 해시코드(hashCode)
  • OSI 7 계층
  • PCB
  • 스프링 설계철학
  • RESTful
  • 준 영속성
  • 지연로딩
  • 프록시객체
  • jpa - mybatis 의 차이
  • orm - mapper 의 차이
  • 쿠키/세션/로컬 스토리지
  • HttpMessageConverter

[회고] 221223 : 리팩토링4 (회고)

강의 전에 하려고 했던, 리팩토링을 오늘중으로 모두 마무리했다. 근 2주간 각각의 계층이 의존도를 낮추면서 어떻게 잘 일하게 할 수 있을까를 고민을 했고, 튜터님들의 세션, 조언들 그리고 팀원들과의 토론을 통해 도출된 결과를 오늘 한번에 반영했다. 아직 아쉬운 점은 많지만, 나름 서비스와 컨트롤러 사이의 의존도를 많이 낮춘 것 같아서 좋았다. 그리고 프로젝트를 4단계에 걸쳐 리팩토링하면서 얻은 꺠달음은 다음과 같다.

  1. Service에 맞게 DTO를 작성하는 것이 의존도를 낮추는 방법이다. 컨트롤러에서는 서비스의 필요에 맞게 DTO를 구성하여 타겟서비스에 전달한다. 그럼 앞단 컨트롤러가 변해도, 받는곳의 인자는 그대로 유지되기 때문에 의존도가 낮아진다.
  2. 서비스는 자기가 맡은 역할만 충실하면 된다. 인증/인가와 같은 서브 로직이 들어가면 안된다. 예를들어, '게시글을 수정한다' 라는 로직은 게시글을 수정하는 목적만 수행해야한다. 게시글 수정이 실제로 일어나는 시점, 즉 핵심비즈니스 로직이 실행되는 시점에는 모든 서브로직들을 거치고 완전한 데이터를 받는 상황을 가정한다.
  3. 연관관계는 보수적으로 만든다. 정말 필요한 곳에만 만든다. 연관관계가 있다는 것은, 조회시 여러 테이블을 살펴봐야한다는 것이다. 물론 모두가 연결되면 좋지만, 긴 쿼리수행시간으로 인한 서비스속도의 저하나, 순환참조같은 변수를 줄이기 위해선 정말 필요한 곳에만 연관을 맺어줘야한다. 마찬가지로 양방향보단 단방향으로 관계를 맺어주고, 필요한 곳에만 양방향으로 관계를 맺어줘야한다.
  4. 역전의 제어를 기억한다. 역전의 제어는 이미 잘만들어진 상위 객체를 가져다 쓰는 것이다. 레파지토리는 이미 잘만들어져있기 때문에, 서비스를 잘만들어주는 것이 스프링 프로젝트를 잘 구성하는 방법중에 하나이다. 컨트롤러는 단지 잘 만들어진 서비스를 가져다쓰는 친구이다.
  5. 역할과 책임에 충실해야한다. 도메인 부터 시작해서 서비스, 레파지토리, 컨트롤러는 각자의 역할이 있다. 그 역할을 벗어나는 일을 맡아선 안된다. 또한 무언가를 뱉는 것은 다음사람에게 똥을 투척하는것이나 같기 때문에 최대한 void형태로 책임을 자기 안에서 마무리 할 수 있도록하자. 만일 무언가를 뱉어야하는 상황이 된다면, 정말 필요한 것만 뱉자.

이외에 더 많은 경험들을 했지만 생각나는것은 이정도이다. 슬슬 자바의 핵심개념들이 다시 등장하고 있는데, 항상 스프링은 자바위에서 돌아가고 있음을 또한 자바는 컴퓨터위에서 돌아가고 있음을 상기해야겠다.

@mitoconcrete
어제보다 조금 더 성장하기 위해 기록합니다.