ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 우아한테크캠프 Day12
    우아한테크캠프 2018. 7. 17. 21:38

    JVM 메모리 구조


    JVM 메모리 구조는 왜 알아야 할까? 성능

    1. 같은 프로그램이더라도 메모리 관리에 따라 성능이 좌우된다.

    2. 메모리 관리가 되지 않으면 속도 저하나 튕김 등이 일어날 수 있다.





    자바 컴파일러(Java Compiler)

    자바 코드(.java)를 바이트 코드로 변환한다.


    클래스 로더(Class Loader)

    클래스를 사용하는 시점에 해당 클래스의 바이트코드를 메모리에 로딩한다. (런타임시 동적으로 로딩)

    (JVM은 우선 JRE 시스템 라이브러리에서 해당 클래스를 찾는다. 없으면 CLASSPATH 환경변수에 지정된 경로에서 클래스를 찾게된다.)


    실행 엔진(Execution Engine)

    바이트 코드를 명령어 단위로 읽어서 실행한다.


    GC(Garbage Collector)

    어플리케이션에서 생성한 객체의 생존 여부를 판단하여, 더는 참조되지 않거나 null인 객체의 메모리를 반납한다. 


    JVM 메모리(Runtime Data Areas) 

    프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간




    참고

    http://limkydev.tistory.com/51

    http://hoonmaro.tistory.com/19




    Day12 학습 내용



    로깅 라이브러리

    개발할 때는 로그를 디버그 모드로 진행하고 운영에 배포할 때는 설정파일을 통해 디버그 모드는 출력 안 되도록 할 수 있다.

    로그 찍을 때 문자열을 '+' 하지 않고, {} 를 사용하는 것이 성능상 좋다. (이유 찾아볼 것)



    API를 사용하는 입장에서 몰라도 되는 부분은 숨기는 것이 좋다. (추상화)

    ex) HTTP 요청 방식이 PUT이라는 사실은 API를 사용하는 입장에서 몰라도 되는 부분이다.

    따라서 put() 메소드 내부에서 .addParamter("_method", "put"); 를 구현하는 것이 좋은 개발 방법이다.



    널 오브젝트 패턴(Null Object Pattern)

    null을 리턴하는 대신, null을 대체하는 클래스 객체를 리턴한다.


    리플렉션

    리플렉션이 무엇이고, 왜 필요하고, 어디서 사용되는 것일까?



    인수 테스트(Acceptance Test)

    HTTP Client (브라우저)라고 생각하면 된다.

    따라서, 서버로부터 오는 응답을 가지고 확인하면 된다.

    (브라우저를 한 번도 띄우지 말고 개발을 진행해 볼 것)


    HTML로 응답하는 경우 테스트 : QnA 2단계(로그인 상태)

    JSON으로 응답하는 경우 테스트 : QnA 3단계(RESTful API)


    수십 번의 수동테스트를 한다는 건 어리석은 행동이다. 자동테스트를 할 것


    현업에서는 관리해야 할 권한이 정말 많다. (관리자, 일반 사용자, etc...)

    따라서 권한 별로 테스트가 일일이 있어야 테스트를 자동화 할 수 있다.


    ※ 인증

    Authentication : 인증 (사용자가 누군지 파악, 식별 과정)

    Authorization : 인가 (식별된 사용자가 어떤 자원에 대해서 권한이 있는지 파악)



    서비스 레이어를 두는 이유

    1. 컨트롤러에 많은 책임을 주지 않기 위해서

    2. 클라이언트가 다양해지더라도 쉽게 대응할 수 있다.

    ※ 로직은 상태 데이터를 가지는 모델이 처리하도록 구현해야 한다.



    도메인객체 내에서 유효성 체크를 하는 게 가장 좋다.

    (유효성 체크 어노테이션 @Valid 에 대해 공부할 것)


    박재성 교수님께 질문한 목록

    1. 프레임워크 동작 방식을 알고 싶을 때 어떻게 하시는지, 분석하는 노하우

    직접 만들면서는 이런 게 있구나 정도로만 인식한다. 자세한 건 스프링 관련 책을 통해 학습한다. 내부 동작 원리 같은 건 책을 통해 학습할 수 밖에 없다.


    2. 답변 추가/삭제할 때, 답변 추가는 질문 객체를 통해 추가하고, 답변 삭제는 답변 객체 스스로를 지우고 있는데 일관성이 맞지 않다고 느낀다.(question.deleteAnswer()를 하지 않은 이유는?) 

    답변 하나 지우는데 성능적인 측면에서 너무 많은 데이터(Question 객체)를 로딩해야 하는 단점이 있어서

    (불필요한 데이터까지 로딩하는 단점이 있어서)


    3. @JsonIgnore은 어느 쪽에 사용하는 것이 좋은지?

    API 사용하는 입장에서 어떤 데이터를 필요로 하는지 파악해서 @JsonIgnore 을 적합하게 사용할 것







    '우아한테크캠프' 카테고리의 다른 글

    우아한테크캠프 Day14  (0) 2018.07.20
    우아한테크캠프 Day13  (0) 2018.07.18
    우아한테크캠프 Day11  (0) 2018.07.17
    enum (열거형)  (0) 2018.07.15
    애노테이션  (0) 2018.07.15

    댓글

Designed by Tistory.