부트캠프 온보딩 강의
1. 자료형을 이해하라
(1) 자료형에는 기본자료형과 객체자료형이 있다
(2) 기본자료형은 기본으로 제공해주는 자료형이고 객체자료형은 사용자가 정의한 새로운 자료형이다(class는 사용자 정의 자료형을 만드는 도구)
(3) 컴파일러는 기본자료형을 보고 바로 알 수 있지만, 사용자 정의 자료형을 보면 무엇인지 몰라서 찾아야함
(4) 그래서 개발자는 사용자 정의 자료형의 위치를 알려줘야함(ex. java.lang.String)
(5) 하지만 java.lang은 많이 사용하기에 컴파일러는 별다른 표시가 없으면 java.lang으로 이해하고 이 패키지를 찾아 클래스를 인식함
(6) 기본자료형은 byte에 따라 담을 수 있는 숫자의 범위가 정해진다(ex. int = 4byte = 32bit = -2^31 ~ 2^31 - 1)
(7) int a = 0b0010, 0105, 0x45 등 2진수, 8진수, 16진수로 표현할 수 있다
(8) 문자자료형은 기보적으로 int로 보관한다
(9) char c = 'a'에서 'a'를 정수로 바꿔서 저장해야함
(10) 그래서 문자랑 정수를 코드로 매핑시켜 놓은 것에 아스키코드와 유니코드가 있음
(11) 예를 들어 'A' : 65, 'a' : 97, '가' : 44032 처럼 매핑이 되어있음
(12) 아스키코드는 1byte여서 비영어권은 매핑이 안돼서 자바는 2byte인 유니코드를 사용함
(13) 변수의 타입을 다른 타입으로 변환하는 것을 '캐스팅'이라고 함
(14) 작은 데이터 타입 -> 큰 데이터 타입으로 변환하는 것은 자동으로 되지만, 큰 데이터 타입 -> 작은 데이터 타입으로 변환할 경우 명시적으로 형변환을 작성해야 함
(15) 기본형 타입에서 연산시
① 두 타입을 같게 일치시킨다(ex. long + int -> long + long -> long, float + int -> float + float -> float)
② int보다 작은 타입이면 int로 변환된다(ex. char + char -> int + int -> int, byte + short -> int + int -> int)
2. 객체와 클래스의 등장
(1) 객체데이터는 하나가 아닌 여러개의 구조로 이루어진 데이터이다
(2) 여러개의 데이터를 묶어서 하나의 자료형으로 만들고 이를 사용자 정의 자료형이라 함
(3) 클래스란 새로운 자료형을 만드는, 설계하는, 모델링하는 도구임
(4) Book b = new Book()에서 new Book()으로 메모리에 Book 인스턴스를 생성하고 이 주소를 b에 담는 방식으로 객체가 생성됨
(5) '.'을 이용해서 객체의 프로퍼티에 접근함
스프링 핵심 원리 고급편 (김영한 강의) - 섹션 3 : 템플릿 메서드 패턴과 콜백 패턴
섹션 목적 : 템플릿 메서드 패턴부터 템플릿 콜백 패턴까지 진화하면서 코드를 발전시켜보자
1. 템플릿 메서드 패턴 - 시작
(1) 지금까지 로그 추적기를 다 만들고 도입하려하니 문제점이 있음
(2) 핵심 로직보다 부가기능인 로그를 출력해야하는 부분의 코드가 더 많고 복잡함
(3) 이 문제를 어떻게 해결할까?
(4) 코드를 보면 try-catch처럼 동일한 패턴이 있다
(5) 부가기능을 메서드로 빼고 싶지만 핵심기능이 중간에 있어서 추출하는 것은 어렵다
(6) 변하는 것과 변하지 않는 것을 분리하자
(7) 비즈니스 로직인 핵심기능은 변하고, 로그 추적기를 사용하는 부가기능은 변하지 않는다
(8) 따라서 이 둘을 분리해서 모듈화해야 한다
(9) 템플릿 메서드 패턴은 이런 문제를 해결하는 디자인 패턴이다
2. 템플릿 메서드 패턴
(1) 템플릿 : 기준이 되는 거대한 틀, 양식이고 그 안에 내용물이 바뀜
(2) 템플릿 메서드 패턴은 부모 클래스(abstract)에 변하지 않는 템플릿 코드를 두고 변하는 부분만을 자식 클래스에 두는 방법임. 상속과 오버라이딩을 통해 해결함
(3) 템플릿 메서드 패턴은 매번 자식 클래스를 만들어야하는 단점이 있는데, 익명 내부클래스를 사용하면 단점을 보완할 수 있다
(4) 적용시켜보자 -> 핵심기능과 부가기능을 분리함으로써 핵심기능에 더 집중할 수 있게 됐다
(5) 정의 : 부모클래스에서 알고리즘의 골격인 템플릿을 정의하고, 변경되는 로직은 자식클래스에 정의하는 것
(6) 자식 클래스가 알고리즘의 전체구조를 변경하지 않고, 특정 부분만 재정의 할 수 있다
(7) 하지만, 단점
① 상속을 사용하기 때문에 상속에서 오는 단점을 안고간다. 자식 클래스는 부모의 기능을 사용하지 않는데 강하게 의존하고 있어서, 부모를 수정하면 자식에도 영향을 준다
② 상속구조를 사용해야해서 익명 내부 클래스를 만드는 것도 복잡하다
(8) 이러한 단점을 개선하려면 어떻게? 전략패턴을 사용하자
3. 전략 패턴 1
(1) 전략패턴은 변하지 않는 부분을 Context에 두고 변하는 부분은 Strategy라는 인터페이스를 만들어 구현하도록해서 문제를 해결함
(2) 전략패턴에서 Context는 변하지 않는 템플릿 역할이고, Strategy는 변하는 알고리즘 부분임
(3) Context 내부에 Strategy 필드를 갖고 있고, 이 필드에 Strategy 구현체를 주입하면 됨
(4) 스프링의 의존관계 주입에서 사용하는 방식임
(5) 전체 흐름
① Context에 원하는 Strategy구현체를 주입
② Context의 execute를 실행
③ Context는 중간에 Strategy.call()을 호출해서 Strategy 로직을 실행함
④ Context는 나머지 로직을 실행
(6) Strategy는 메서드가 1개만 있는 인터페이스이므로 람다로 변경 가능함 -> 굉장히 깔끔해짐
(7) 정리 : 변하지 않는 부분 Context에 변하는 부분 Strategy를 주입해서 만든다
(8) 선 조립 후 실행 방식임. 실행 전에 Context와 Strategy를 먼저 조립하고 실행하기만 하면 됨
(9) 하지만 이 방식의 단점은 조립한 이후에 Strategy를 변경하기 어렵다는 점임
(10) Context를 싱글톤으로 사용할 때 동시성 이슈 등 고려할 점이 많다
(11) 먼저 조립해서 사용하는 것이 아닌 유연하게 전략패턴을 사용하는 방법은 없을까?
4. 전략패턴 2
(1) Context 필드에 Strategy를 주입했다면, 실행할 때 전략을 파라미터로 넘겨서 사용해보자
(2) Context는 Strategy를 필드로 갖고 있지 않는다. 대신에 execute()의 파라미터로 전달받는다
(3) Context와 Strategy를 선조립 후 실행이 아니라 Context를 실행하는 시점에 Strategy를 전달한다 -> 훨씬 유연해짐
(4) 하나의 Context만 생성해서 여러개의 전략을 인수로 전달해서 유연하게 실행
(5) 전체 흐름
① 클라이언트는 Context를 실행할 때 인수로 Strategy를 전달
② Context는 execute() 로직을 실행
③ Context는 파라미터로 넘어온 Strategy.call()을 실행
④ Context의 나머지 로직 실행 후 종료
(6) 당연히 Strategy를 람다로 사용해서 코드를 간결히 할 수 있음
(7) 정리
① ContextV1은 필드에 Strategy를 저장하는 방식으로 전략패턴을 구현
* 선 조립 후 실행에 적합
* Context를 실행하는 시점에 조립이 끝났기에 전략을 신경쓰지 않고 실행만하면 됨
② ContextV2는 파라미터에 Strategy를 전달받는 방식으로 전략패턴을 구현
* 실행할 때마다 전략을 유연하게 변경가능
* 실행할때마다 전략을 계속 지정해줘야하는 단점
(8) 우리는 변하지 않는 템플릿 안에서 변하는 부분에 약간 다른 코드 조각을 넘겨서 실행하는 것이 목적임
(9) 따라서 실행시점에 유연하게 실행 코드 조각을 전달하는 ContextV2가 더 적합
5. 템플릿 콜백 패턴
(1) 앞서 본 ContextV2가 템플릿 콜백 패턴임
(2) ContextV2는 템플릿 역할, 파라미터로 넘어온 실행가능한 코드 조각인 Strategy를 콜백이라 함
(3) 자바 언어에서는 자바8 이후부터 람다를 사용해서 콜백을 구현함
(4) 이 패턴은 스프링에서 자주 쓰이며, xxxTemplate는 템플릿 콜백 패턴으로 되어있음 -> 떠올리자!
6. 한계
(1) 이렇게 수정했지만, 로그 추적기를 적용하려면 적게든 원본 코드를 수정해야함(만개면 어떻게할거?)
(2) 위 문제를 앞으로 프록시 방법으로 개선해보자
부트캠프 온보딩 강의랑 스프링 강의를 들으니깐 시간이 빠듯하다. 일단 우선순위에 따라서 되는것까지 해보자.
오늘 하루도 고생했다!!!
'TIL(Today I Learned)' 카테고리의 다른 글
2023.07.08 (0) | 2023.07.10 |
---|---|
2023.07.07 (0) | 2023.07.07 |
2023.07.05 (0) | 2023.07.05 |
2023.07.04 (0) | 2023.07.04 |
2023.07.03 (0) | 2023.07.03 |