이름을 잘짓자.

변수명을 잘짓자

  • 이름을 잘지으면 단순히 코드만 보고도 무슨 기능을 하는지 다 알수 있다.

  • 컨테이너 가 list라도 실제 컨테이너 유형을 이름에 넣지 않는게 바람직하다.

  • 일관성 있게 이름지어라

  • 이름 지을때 내 의도를 읽는사람이 알수 있게 하자.

  • 의미없는 단어를 넣지마라

  • pruduct란 클래스가 있을 경우 다른 클래스를 productInfo 나 productData라고 쓰지말자

  • 이건 개념을 구분하지 않은채 이름만 달리한 경우이다.

  • data나 info는 의미가 불분명한 불용어다.

  • 관례가 없다면 읽는사람은 product나 productInfo의 차이를 모를것이다.

  • 발음하기 쉽게 지어라

  • 그래야 기억하기도 쉽다.

  • 소스를 검색할때 검색이 잘되게 지어라.

  • 그래야 찾기도 쉬우니까.

  • 이름에 인코딩하지마라

  • 내 생각. (이런걸하는 제정신인 사람이 있는가 ? 암호화 시키는것이면 몰라도..)

  • 변수명에 type을 집어넣었을경우 변수의 type이 바꼈을때 변수명은 그대로 String이므로 변수명에 타입은 쓰지말자.

  • 접두어 쓰지말자.

  • 인터페이스에 접두어 I같은것을 넣지 않는것이 좋다고 생각한다 ( 작가생각 )

  • 구현클래스에는 impl 같은것을 붙이거나 앞에 C를 붙이는것이 인터페이스에 접두어 넣는것보다 좋다고 생각한다고 작가는 말한다.

  • for문의 반복변수 ijk까진 가능하다 근데 L은 절대 쓰지말라고한다

  • 클래스의 이름은 명사나 명사구가 적합하다.

  • manager processor data info 등과 같은 단어를 피하고 동사를 사용하지 않는다.

  • 메서드이름은 동사나 동사구가 적합하다.

  • postPayment, deletePage, save 등이 좋은 예

  • 접근자 변경자 조건자 는 javabean 표준에 따라 앞에 get , set , is를 붙인다.

    • 이 메소드는 데이터형 클래스에서 값 가져오거나 설정하거나 값 true false 체크할떄 쓰는그거같음
  • 생성자를 중복정의 할때는 정적 팩토리 메서드를 사용한다.

  • 메서드는 인수를 설명하는 이름을 사용한다.

  • 예)

  • 1번 ) Complex fulcrumPoint = Complex.FromRealNumber(23.0);

  • 2번 ) Complex fulcrumPoint = new Complex(23.0);

  • 1번소스가 2번소스보다 좋다.

  • 2번소스를 사용하지 못하게 할려면 생성자를 private이나 protect를 걸어버리자

  • 단 protect는 같은 패키지안에서 사용될수 있으므로 같은패키지안에서도 싫으면 private쓰자.

  • 의도를 분명하고 솔직하게 표현해라

  • 이상한 농담같은거나 기발한것들은 피하자.

  • 비슷한단어를 클래스들마다 다르게 쓰지말자 메소드도 마찬가지고

  • 일관성있게 이름짓자 get이면 get으로 다 통일 controller면 다 controller로

  • 하지만 위처럼 쓰라고했다고 기능이 다른데도 같게 쓰면 문제있는것이다.

  • 기능과 이름의 일관성을 유지하라.

  • 해법영역에서 가져온 이름을 사용해라.

    • 대충 전산용어 알고리즘이름 패턴이름 수학용어등을 사용해도 괜찮다는 뜻.
  • 적절한 프로그램용어가 없다면 문제영역에서 가져와야한다.

  • 클래스 내부에 firstName , lastName , street , city , state란 변수가 있을때

  • 한 메소드에서 state란 변수를 사용했을때 이 변수가 어떤 클래스의 일부라는 사실을 알수 있을까 ?

  • 클래스의 일부가 아니더라도 위에것들은 address와 관련된 것들이다.

  • 이 state란 변수가 address와 관련된것인걸 알수 있을까 ?

  • 모르기 때문에 state 앞에 addr이라는 접두어를 붙인다.

  • addrState

  • 공통으로 사용된 변수들의 연관관계를 알수 있게 앞에 접두어를 붙여주거나

  • 클래스 함수 이름 공간에 넣어 맥락을 부여한다.

  • 모든 방법이 실패했을때만 접두어를 넣어준다.

  • 예제를 보면 이해가 쉬워진다.

  • Gas Station Deluxe 라는 앱을 만든다고 가정했을떄 모든클래스의 이름을 GSD로 시작하겠다는것은 미친짓이다.

  • 의미가 분명한 경우에 한해 짧은이름이 더 좋다.

  • accountAddress와 customerAddress는 Address 클래스 인스턴스로는 좋은 의미이지만

  • 클래스이름으로는 별로다.

  • Address가 클래스 이름으로 적합하다.

  • 주소를 port mac, web으로 구분지어야 한다면

  • postalAddress, Mac , Url이란 이름도 괜찮다. 그러면 의미가 분명해진다.

결론 이름 잘지어라

'book > 클린코드' 카테고리의 다른 글

7장 - 오류처리  (0) 2020.11.27
6장 - 객체와 자료구조  (0) 2020.11.25
5장 - 형식 맞추기  (0) 2020.11.23
4장 - 주석  (0) 2020.11.22
3장 - 함수  (0) 2020.11.19

JVM 이란 ?

  • 어느 OS 어느 환경에서 든지 java를 실행시킬수 있게 해줌.
    • bytecode가 JVM위에서 실행되기 때문이다.
  • java bytecode를 os가 읽을수 있게 바꿔줌 ( 이 작업은 인터프리터와 JIT컴파일러를 사용)
    • 특정 OS별로 네이티브 언어를 바꿔줘야 하기때문에 특정 OS에 종속적이다.

컴파일 하는 방법.

  • javac.exe 를 사용하여 컴파일 한다.

실행하는 방법

  • java.exe 를 사용하여 클래스파일을 실행시킨다.

바이트코드란 무엇인가 ?

  • jvm이 이해할수 있는 상태인 코드
  • 이 바이트 코드는 인터프리터와 JIT 컴파일러가 읽을 수 있다.

JIT 컴파일러란 무엇이며 어떻게 동작하는지 ?

  • 중복된 바이트코드를 네이티브 언어로 모두 바꿔주는 컴파일러

  • 인터프리터가 읽으면서 컴파일시키고 실행하다가 중복되는 부분을 발견하면

  • JIT컴파일러로 보낸다 그럼 JIT 컴파일러가 중복된 바이트코드를 모두 네이티브 언어로 바꿔준다.

JVM 구성요소

  • 클래스 로더 시스템 , 메모리 , 실행엔진 , 네이티브 메소드 인터페이스, 네이티브메소드 라이브러리로 나뉘어져 있다.
  1. 클래스로더 시스템

    • 컴파일된 class 파일들을 읽어서 메모리에 적절히 배치시킨다.
    1. 로딩

      • 클래스에서 바이트코드를 읽어오는 과정

      • 클래스 로더가 class파일을 읽고 그 내용에 따라 바이너리 데이터를 만들고 메소드 영역에 저장

      • 이떄 저장하는 데이터는

        • FQCN ( 패키지, 풀 패키지 경로와 클래스 이름 )
        • 클래스 , 인터페이스, 이늄 ( 클래스가 어떤 타입인지 저장 )
        • 메소드와 변수
      • 로딩이 끝나면 해당 클래스 타입의 class 객체를 생성하여 힙 영역에 저장.

      • 처음에 bootstrap classloader에서 찾아서 없으면 자식인 platform classloader가 찾고

      • 또 없으면 application classloader가 찾아서 없으면 class not found 익센션을 호출

      • bootstrap classloader는 네이티브 코드로 구현되어 있어 JVM마다 구현이 다 다르다.

    2. 링크

      • 레퍼런스를 연결하는 과정
      • verify , prepare, revolve 3단계로 나뉘어져 있다.
        • verify
          • .class파일이 유효한지 확인
            • 파일이 유효하지 않으면 JVM에러로 종료됨.
        • prepare
          • static변수와 기본값에 필요한 메모리를 준비하는 과정
        • Resolve ( Optional )
          • 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체하는 과정.
          • 심볼릭 메모리 레퍼런스란 ?
            • 다른 객체를 참조할때 논리적으로만 연결시켜놓고 실제론 연결되어 있지 않음.
    3. 초기화

      • statc 값들 초기화 및 변수에 할당
  2. 메모리

    1. 스택
      • JVM 쓰레드가 생길때 해다 쓰레드를 위한 스택도 같이 생긴다.
      • 이때 프레임이 스택에 들어가며 이 프레임은 메소드가 호출될때마다 만들어지며
      • 메소드의 상태 정보를 저장한다.
      • 쓰레드를 종료하면 런타임 스택도 사라진다.
    2. PC
      • 쓰레드마다 쓰레드 내 현재 실행할 스택 프레임을 가리키는 포인터가 생성된다.
    3. 네이티브 메소드 스택
      • 쓰레드 마다 생기는 스택인데 native method가 호출될때 쌓인다.
      • JNI를 사용하는 메소드는 여기에 스택이 쌓인다.
      • 객체를 저장, 공유
    4. 메소드
      • 클래스 수준의 정보를 저장, 공유
      • (클래스 이름 , 풀패키지 경로 , 부모 클래스 이름 , 메소드 , 변수)
      • 다른 영역에서 참조 가능
  3. 실행 엔진

    1. 인터프리터
      • 바이트코드를 한줄마다 읽음과 동시에 네이티브 코드로 변경시키면서 실행시킴.
    2. JIT 컴파일러
      • 인터프리터가 반복되는 코드를 찾으면 JIT 컴파일러로 보내서 JIT 컴파일러가 반복되는 코드를 모두 네이티브 코드로 바꿔둔다.
      • 그러면 인터프리터는 네이티브 코드를 바로 실행시킨다.
    3. GC
      • 더이상 참조되지 않은 객체를 메모리에서 해제시킨다.
  4. 네이티브 메소드 인터페이스

    • 자바에서 C나 C++된 함수를 사용할수 있는 방법을 제공하는 인터페이스
  5. 네이티브 메소드 라이브러리

    • C , C++로 작성된 라이브러리

JDK와 JRE의 차이

  • JRE는 단순히 자바를 실행할수 있게만 해줌

    • JVM과 라이브러리들이 포함.
    • 자바 런타임 환경에서 사용되는 프로퍼티 세팅이나 리소스 파일을 가지고 있다.
  • JDK는 JRE와 개발툴들이 같이 포함되어 있음.

출처

'백선생님 온라인스터디' 카테고리의 다른 글

6주차 상속  (0) 2021.01.10
4주차 - 제어문  (0) 2021.01.09
3주차 연산자  (0) 2021.01.07
연산자  (0) 2020.11.28
스터디 2주차 - 자바 데이터타입, 변수 그리고 배열  (0) 2020.11.21

파드

 

  • 파드는 컨테이너들의 집합
  • 파드내의 컨테이너들은 중복된 포트를 가질수 없으나 포트를 여러개 가지는건 가능함.
  • 파드는 생성시 IP를 자동으로 할당받는다.
    • 외부에서는 이 ip로 접근할수 없다.
    • 파드에 문제가 생길경우 시스템이 감지해서 파드를 삭제후 재생성하는데 이때 Ip주소는 변경됨
    • 그러므로 파드는 문제가 생기면 삭제후 재생성 되므로 휘발성임
    • 휘발성은 Stateless

 


 

라벨

 

  • 모든 오브젝트에 붙일수 있음.
  • 목적에 따라 오브젝트를 분류시켜서 연결시키거나 검색할때 유용함.
  • 구성은 key : value가 구성되어있고 한 파드에 여러개의 라벨을 달수 있음.
  • selector을 이용하여 검색함

기본구성

  • 마스터 - 노드1 - 노드2
  • VirtualBox를 이용해 CentOs7로 마스터 노드1 노드2 서버를 설치함.
  • 네트워크는 어댑터에 브릿지로 설정하여 마스터 노드 노드2의 아이피를 각각 다르게설정
  • 마스터는 192.168.35.30 노드는 31 노드2는 32
  • 마스터에 calico plugin 와 dashboard plugin 설치

트러블 슈팅

  • 처음에 강의처럼 192.168.0.x로 했다가 timed out이 발생
  • 그 이유는 내 호스트OS의 내부ip가 192.168.35.x 인걸 확인 후 수정
  • 마스터에서 kubernetes를 reset하는 상황이 발생
    • master 에서 자기자신을 node로 등록하려는 실수이후 node에서 master로 join이 안됨
    • 그래서 master에서 kubernetes를 reset함
    • reset 후 init로 초기실행하고 node들을 master에 join 시킴.
    • 하지만 master 에서 권한 문제가 생김
    • KUBECONFIG=/etc/kubernetes/admin.conf 이런식으로 쿠베컨피그에 설정하니 권한잘됨

참조

1. 설치 관련

https://www.cubrid.com/blog/3820603

https://kubetm.github.io/practice/appendix/installation_case2/

2. 2번 문제

https://github.com/kubernetes/kubeadm/issues/1721

https://stackoverflow.com/questions/61072700/issues-after-running-kubeadm-reset

https://github.com/kubernetes/kubeadm/issues/1721

효과적인 리팩토링 , TDD 연습방법.

의식적으로 연습해라 이것에 대한 7가지 원칙

  1. 효과적인 훈련 기법이 수립되어 있는 기술을 연마
  2. 개인의 컴포트 존을 벗어난 지점에서 진행, 자신의 현재 능력을 살짝 넘어가는 작업을 지속적으로 시도
  3. 명확하고 구체적인 목표를 가지고 진행
  4. 신중하고 계획적이다. 즉 개인이 온전히 집중하고 의식적으로 행동할것을 요구
  5. 피드백과 피드백에 따른 행동 변경을 수반해야 한다.
  6. 효과적인 심적 표상을 만들어내는 한편으로 심적 표상에 의존
  7. 기존에 습득한 기술의 특정 부분을 집중적으로 개선함으로써 발전시키고 수정하는 과정을 수반

1단계 - 단위테스트 연습

내가 사용하고 있는 api들을 이용하여 테스트

  • java String class의 다양한 메소드 사용법
  • java ArrayList에 데이터를 추가 수정 삭제하는 방법

효과

  • 단위테스트 방법을 학습할 수 있다.
  • 단위테스트 도구의 사용법을 익힐수 있다.
  • 사용하는 API에 대한 학습효과가 있다.

2단계 - tdd 연습

  • 실제 프로젝트 말고 토이프로젝트에서 연습하자.

  • 웹 모바일 ui나 db에 의존관계를 가지지않는 요구사항으로 연습한다.

  • 리팩토링 시 메소드를 분리를 잘해야 한다.

  • 메소드는 한가지 일만 하게 만든다.

    • 들여쓰기를 1단계만 허용한다.
    • 2단계부터는 메소드로 분리해서 리팩토링
    • else를 쓰지않는다.
  • 로컬 변수가 필요한지도 고민해본다.

  • Compose method 패턴 적용

    • 메소드의 의도가 잘 드러나도록 동등한 수준의 작업을 하는 여러단계로 나눈다.
  • Compose method 패턴으로 동등한 수준의 기능들을 각각의 메소드로 만들어서

  • 한눈에 무슨기능을 하는지 알수있게 하고 그 기능들이 어떻게 구현되는지 보려면

  • 메소드를 보는 방식으로 하고 메소드의 기능을 알려면 모든 코드를

  • 확인할 필요가 없는 장점이 있다.

  • 3개이상의 인스턴스 변수를 사용하지 않는다.

  • 인자의 갯수를 최소한으로 조절

  • 클래스도 가능한 작게 만들어라

영상

https://www.youtube.com/watch?v=cVxqrGHxutU&ab_channel=OKKY

문서

https://www.slideshare.net/OKJSP/okkycon-tdd

'개발 > java' 카테고리의 다른 글

공변 불변 반공변  (0) 2021.04.26
JVM 구조 복습 - 1  (0) 2020.08.03
enum 사용시 주의할점  (0) 2020.05.13
멤버변수의 초기화 시기와 순서  (0) 2020.04.15

www.notion.so/OAuth-1ac11441fca1492191283ef70c589b89

 

OAuth

OAuth

www.notion.so

OAuth

 

  1. OAuth

아이디나 암호가 노출되지 않고 api의 접근을 위임하는 방식

인증과 인가를 사용하는 방식

 

써드파티에 아이디 비밀번호를 넘기는건 위험하므로 api 토큰을 써드파티가 사용하게함

써드파티 어플리케이션이 api 토큰으로 api 서비스 정보를 요청하고 받아올수 있음

 

Request Token 의 요청과 발급이 이루어지고

사용자 인증 페이지 호출

사용자 로그인 완료

사용자의 권한 요청 및 수락

Access Token 발급

Access Token 을 이용해 서비스 정보를 요청

 

2. OAuth 1 과 2 의 차이점

2는 SSL을 사용함

2는 Client에서 암호화를 위한 코드를 삽입할 필요가 없음 (SHA1등)

 

1은 인증을 얻기 위해 web 환경만 지원

2는 web 말고 다른 환경도 지원함.

 

1은 보안토큰이 2개 사용되고 2는 하나만 사용됨

 

3. OAUTH2 기준 구현 방식이 뭐가 있고 어떤 시나리오에 적합한가

 

시나리오

적합한 시나리오는 서드파티 나 다른 어플리케이션 , 모바일 어플리케이션 또는

웹의 SPA 방식에서 아이디와 비밀번호를 노출하지않고 토큰으로 리소스를 가져오는 것

구현 방식

security에서 oauth 설정

인증 서버 클래스 설정

인가 서버 클래스 설정

(자세하게 추가 필요)

 

4. OAUTH2 기반으로 JWT 라는 게 있는데 이거는 뭐고 어떤 경우에 좋고 어떤 고려사항이 있는가

 

JWT 란

 

토큰을 JSON 방식으로 만들고 모든 정보 ( 토큰의 기본 정보 , 유저 정보, 토큰이 검증됐다는것을 증명해주는 시그니쳐 정보 ) 를 가지고 있고 헤더나 url에 넣어서 전달이 가능함.

총 3가지 부분으로 나뉘어져 있는데 . 으로 그것을 구분하며

 

첫번째 헤더 부분 은 토큰의 타입과 해싱 알고리즘이 등록 되어있고

 

두번째 내용 (페이로드 ) 부분은 등록된 클레임 , 공개 클레임 , 비공개 클레임이 등록되어있습니다.

 

등록된 클레임 은 서비스에서 필요한 정보들이 아닌 토큰에 대한 정보들을 담기위하여 이름이 이미 정해진 클레임들입니다.

예) 토큰발급자 iss , 토큰 제목 sub , 토큰 대상자 aud 토큰 만료시간 exp 등

 

공개 클레임은 충돌이 방지된 이름을 가지고 있어야 하므로 클레임 이름을 URI 형식으로 짓습니다.

예) "https://xxxx.xxx/aa/aa" : true

 

비공개 클레임은 클라이언트와 서버의 협의하에 사용되는 클레임 이름들입니다.

공개 클레임과는 달리 이름이 중복되어 충돌이 될수 있습니다.

예) "username" : "aaaa"

 

payload 예)

 

{

    "iss": "velopert.com",
    "exp": "1485270000000",
    "https://velopert.com/jwt_claims/is_admin": true,
    "userId": "11028373727102",
    "username": "velopert"
}

 

세번째 부분은 시그니쳐 부분입니다.

이 시그니쳐 부분은 헤더의 base64 인코딩 값 정보의 base64 인코딩 값을 합친 후 주어진 비밀키로 해쉬를 하여 생성.

 

JWT의 장점

jwt 발급 후 토큰 검증만 하면 되기 때문에 추가 저장소가 필요 없음

토큰 기반으로 하는 다른 인증 시스템에 접근이 가능

 

JWT의 고려사항

토큰의 페이로드에 3종류의 클레임을 저장하기 때문에 토큰의 길이가 엄청나게 길어질경우

네트워크에 부하를 줄수가 있다.

 

페이로드 인코딩은 자체 암호화가 아니라 base64인코딩이므로 중간에 탈취되서 디코딩하면

데이터가 보인다. 시그니쳐는 비밀키로 sha 해싱하기 때문에 알수가 없음.

 

stateless 무상태이기 때문에 제어 (임의 삭제, 수정 등) 이 불가 하므로 토큰 만료시간을 꼭 넣어줘야한다.

 

토큰은 클라이언트 측에서 관리해야 하기 때문에, 토큰을 저장해야 한다.

 

 

 

5. OAUTH 토큰을 어떤 식으로 전달하고 보관하는 것이 보안에 안전한가.

 

  1. 요청 헤더나 바디에 넣어서 전달하는 방법은 빠르나 보안에 매우 취약하다.
  1. 헤더에 쿠키를 담아 보내는 방법은 1번 보다는 안전하다 마찬가지로 탈취되면 보안에 취약함
    1. 계정정보가 담기지 않았으므로 1번보다는 안전하지만 탈취된 쿠키를 이용해 http 요청을 보내면 서버의 세션 저장소가 쿠키의 탈취 여부를 알수없어 그대로 정보를 제공함
      1. 해결책은 https 를 사용해 쿠키를 읽을수 없게 하거나 세션에 유효시간을 넣어준다.
      1. 세션 저장소를 사용하므로 서버에 어느정도 부하가 생김

       

  1. JWT 방식
    1. 장점
      1. stateless 하므로 따로 저장소를 사용하지 않습니다.
      1. 확장성이 뛰어나므로 토큰기반의 다른 인증시스템에 접근이 가능합니다. ( facebook, google 등)

         

    1. 단점
      1. claims가 많을수록 jwt가 길어짐. 요청이 많아질수록 자원낭비 발생함.
      1. 중요한 정보를 payload에 넣을수 없음. base64로 인코딩 되어있기때문에 손쉽게 디코딩해서 정보를 볼수가 있음.
      1. jwt 역시 탈취되면 유효기간이 지나기 전까지 정보가 탈취됨.
        1. AccessToken의 유효기간을 짧게하고 Refresh Token을 이용해 새롭게 인증을 요청시킬수 있게 변경해야함.

     

 

6. Resource Server

실질적으로 요청이 들어오면 access_token을 확인 후 유효한지 체크 하고

요청에 알맞는 리소스를 response 해주는 서버

 

 

 

 

 

참조 출처

 

Oauth2의 암시적 허용

https://docs.microsoft.com/ko-kr/azure/active-directory/develop/v2-oauth2-implicit-grant-flow

 

JWT

https://velopert.com/2389

 

JWT 고려사항

https://mangkyu.tistory.com/56

 

OAUTH 토큰 보안

https://tansfil.tistory.com/58

'개발 > etc' 카테고리의 다른 글

네트워크 복습 1  (0) 2020.08.14
JUnit5 에서 parameter 사용하기  (0) 2020.07.21
Lombok  (0) 2020.07.19
어플리케이션 아키텍처와 객체지향 영상 후기  (0) 2020.06.28
blob  (0) 2020.04.30

Notion Link

 

www.notion.so/Repository-Interface-Respoitory-6d78269d33d54e828ffb219153965eb7

 

Repository Interface에 @Respoitory가 없는 이유

@Repository 는 컴포넌트 스캔 뿐만이 아니라 JPA의 예외를 스프링에서 공통적으로 처리할수있는 예외로 변환하는 기능도 포함되어 있다.

www.notion.so

 

 

  • @Repository 는 컴포넌트 스캔 뿐만이 아니라 JPA의 예외를 스프링에서 공통적으로 처리할수있는 예외로 변환하는 기능도 포함되어 있다.

  • @Repository 를 생략가능한 이유는 컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 처리해준다.

    • @EnableJpaRepositories 이 어노테이션이 그역할을 수행하고
      • 또 jpaRepository에 대한 설정정보를 자동으로 로딩함.
    • 부트는 EnableJpaRepositories 이 자동적용 되어있기 때문에 따로 할 필요가 없음.
  • 위에서 말한 JPA 예외를 스프링 예외로 변환하는 과정도 스프링 데이터 JPA가 자동으로 처리해준다.

 

 

참고

 

인프런 강의 - 김영한 실전 스프링 데이터 JPA

https://engkimbs.tistory.com/821

'개발 > jpa' 카테고리의 다른 글

post 와 comment 내가 선택한 출력 방식  (0) 2020.06.02
JPA  (0) 2020.03.03
  • HandlerMapping 은 핸들러를 찾아주는 Interface ( strategy pattern )

  • HandlerAdapter 은 핸들러를 실행하는 Interface

  • 요청 분석 후 멀티 파트 타입 요청 ( 파일 업로드 ) 인지 로케일은 어떤건지 테마는 어떤 테마인지 정보를 판단 후 이 요청을 처리 할수 있는 핸들러를 찾는다. ( handlerMapping)

  • 아무런 설정을 하지 않아도 디스패쳐서블릿이 기본으로 BeanNamerUrlHandler 와 RequestMappingHandler 를 갖고 있다.

  • RequestMappingHandler는 GetMapping, PostMapping 등이 핸들러를 지정한것을 찾아주는 핸들러 매핑

  • for문을 돌면서 핸들러를 찾고 찾으면 핸들러를 return 한다 ( handlerMapping)

  • 그 다음 실행 할 수 있는 핸들러 어댑터를 찾는다. ( HandlerAdapter )

    • 기본으로 HttpRequestHandlerAdapter , SimpleControllerHandlerAdapter , RequestMappingHandlerAdapter 이 존재한다.
  • 이 중 실행할수 있는 핸들러를 return 한다.( HandlerAdapter )

  • 핸들러를 실행하기 전에 http GET Method 라면 캐싱 기능을 지원.

  • 핸들러 어댑터가 요청을 처리하는데

  • 핸들러를 가져와서 handerIntener로 들어가서 reflection (InvokeHandlerMethod 메소드) 을 사용해서 요청에 등록된 controller을 실행

  • InvokeHandlerMethod는 인자로 request, response, handlerMethod를 주입받음.

    • HandlerMethod 객체 안에는 이미 method에 대한 정보가 주입되어 있음.
  • 이 주입된 정보를 reflection을 이용하여 호출

    • @RestController은 일반적인 @Controller 에 @ResponseBody를 사용한것과 동일함
  • 호출후 return값을 받아서 이 값을 처리 할수 있는 returnValueHandler를 찾는다.

    • @ResponseBody가 있으면 returnValueHandler 는 Converter를 사용해서 return 값은 HTTP 본문에 넣어주는 처리를 함. ( view에 rendering 을 하지 않음 )
    • @ReponseBody가 없으면 view의 이름을 찾아 model의 data를 rendering 시킴
    • 이때 view의 이름은 Controller의 return 값
  • 예외 발생시 등록된 HandlerExceptionResolver 중 가장 적절한 Resolver를 찾아서 예외를 처리.

  • 최종적으로 응답을 보냄.

+ Recent posts