코테 스터디 진행

https://velog.io/@d-h-k/leetcodesort-array-by-parity-ii-Java풀이
https://velog.io/@d-h-k/leetcodedi-string-match-Java풀이
https://velog.io/@d-h-k/leetcode-flipping-an-image-Java풀이
https://velog.io/@d-h-k/leetcode-richest-customer-wealth-Java풀이
https://velog.io/@d-h-k/Java풀이-leetcode-kids-with-the-greatest-number-of-candies
https://velog.io/@d-h-k/Java-풀이-defanging-an-ip-address



오브젝트 저자 조영호님 특강

스프링 학습

  • 필터, 인터셉터, 스프링 (IOC DI AOP)

AOP - 관점 지향 프로그래밍

  • 프로그램을 작성할 때, 다수의 모듈에 공통적으로 나타나는 부분을 횡단 관심사(cross-cutting concern)라고 한다. (예를들어 메서드 수행시간 측정, 로그)

코드 = 핵심 관심사 + 횡단 관심사

  • AOP는 횡단관심사를 처리하기 위한 로직 주입
  • AOP 메서드에서 코드를 주입할 수 있는 곳은 5군데
    • Around(메서드 전 구역),
    • Before(메서드 시작 전),
    • After(메서드 종료 후),
    • AfterReturning(메서드 정상 종료 후),
    • AfterThrowing(메서드에서 예외가 발생하면서 종료된 후)

DI - 의존성 주입

  • 객체간 의존성을 코드 내부에서 정적으로 하는게 아니라 동적으로 런타임에 외부에서 주입받는다
  • 설정만 바꿔줘도 하위모듈을 바꿀수 있다

자동차의 예시

  • 자동차 샤시 / 휠 / 타이어가 있는데
  • 의존성 내포(코드상에서 new 키워드를 통해 실체화시키면) 코드의 경우 샤시는, 휠의 정보를 알아야하고, 휠은 또다시, 타이어에 대한 구체적인 정보를 알아야 한다
  • 위 상황을 다시 말하면 타이어를 바꾸기 위해서는 휠을 바꾸고(어..? 타이어뱅크인가?)
  • 휠을 바꾸기 위해서는 자동차(샤시)를 바뀌야 하는 상황이다
  • 위와같은 문제를 해결하고자, 설정파일(XML), 혹은 @(어노테이션) 을 사용해 런타임에 객체를 동적으로 할당해주는게 바로DI
  • DI 인 이유는 샤시에서의 휠의 의존성이 샤시 내부가 아니라 외부(설정파일/어노테이션)으로 넘어갔기 때문에

좀더 개발자스럽게 설명하면

  • 의존성 주입이란 외부에서 생성 된 객체를 사용하는(혹은 객체 의존성을 외부에서 전달받는) 방법이다.
  • 스프링에서는 객체를 Bean이라고 부르며, 프로젝트가 실행될때 사용자가 Bean으로 관리하는 객체들의 생성과 소멸에 관련된 작업을 자동적으로 수행해주는데 객체가 생성되는 곳을 스프링에서는 Bean 컨테이너라고 부른다.

IOC - 제어의 역전

  • IoC(Inversion of Control)란 "제어의 역전"/"제어(컨텍스트)의 흐름을 바꾼다"
  • 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것을 의미

기존 제어순서

  • new객체 생성 : 의존성 있는 객체가 클래스 내부에서 객체를 생성
    • 샤시 클래스 내부에 > new Wheel wheel;
  • 의존성 객체의 메소드 호출
    • wheel.steerLeft / wheel.tractionControl

IOC가 적용된 스프링에서는

  • 객체(Bean) 생성
    • 의존성 객체 주입받는데(DI!)
      • 스스로가 만드는것이 아니라 제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입한다.
  • 의존성 객체 메소드 호출
    • 스프링이 모든 의존성 객체를 스프링이 실행될때 다 만들어주고 필요한곳에 주입(Bean들은 싱글턴 패턴)
  • 제어의 흐름이 결국
    • 사용자가 컨트롤 하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다
  • 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성
  • 유지 보수가 편해진다 : 무지성으로 그냥 시키는데로 정해진 규칙만 따라서 코드를 넣으면 되니까!

참고 : 프레임워크 vs 라이브러리

  • 프레임워크 :
    • 내 코드가 (남이 만들어놓은)프레임워크 속으로 들어가서 프레임워크가 정해주는 규칙을 따라 코딩하는것
    • 예) 스프링, 자마린, 리눅스 디바이스 드라이버&&커널

  • 라이브러리 : 남이 만들어놓은 코드를 끌어다가 내 코드속에 집어넣고 돌리는거
    • 예) 파이썬에서의 opencv, 케라스, pandas, numpy 등등..

PSA - 일관성 있는 서비스 추상화

  • PSA : Portable Service Abstraction
  • 일관성 있는 서비스 추상화이다.
  • 어댑터 패턴을 적용해 같은 일을 하는 다수의 기술을 공통의 인터페이스로 제어할 수 있게 한 것을 서비스 추상화라고 한다.
  • 조영호님 왈 프렉탈구조
  • 처럼 작은 서브모듈에서의 구조/원리가 전체 큰 그림에서도 동일해야 어플리케이션 복잡도를 낮출 수 있다.
    스프링은 OXM(Object XML Mapping: 객체와 XML 매핑), ORM(Object Relational Mapping: 객체와 관계 매핑), 캐시, 트랜잭션 등 다양한 기술에 대한 PSA를 제공한다.




회사에서 OOP 리팩토링한 썰

원래는

  • 회사에 프로덕션 코드가 있었는데 진짜 신비롭고 대단한 코드였다.
  • 정규 교육과정에서 하지말란것들이 모두 들어가있는 안티패턴의 총본산 이였는데, 예를들면
    • 프로퍼티 노드, 글로벌 변수 쓰면 안좋다
      : 범벅되어있었다. 자주쓰이는 설정파일(프로그램 시작시 한번 파일에서 읽음) 변수 읽기가(R-val) 60군데, 변수 쓰기가(L-val) 10군데
    • 슈퍼루프 패턴
      : 모든 프로덕션 코드가 하나의 거대한 와일루프에 들어있었다. 그러니까 자동차 제어 시뮬레이터인데, 중간에 모달창 하나라도 띄울려면 All STOP
      : 특히 문제가 심했던게 초기화 동작 부분이였는데,
profile
Sorbet is good...!

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN