글

라벨이 Java인 게시물 표시

Linkedin Learning - Programming Foundations: Design Patterns 후기

이미지
링크드인 러닝에서 디자인 패턴에 대한 강의를 수강 하였다.  디자인 패턴에 대하여 개략적으로만 알고 있을 뿐, 이번에 제대로 좀 보자고 생각하여서 보게 되었다. 회사마다 다르고, 팀마다 다르겠지만 우리 팀에서는 MVC Framework의 패턴을 따르고만 있을 뿐 디자인 패턴을 적용하고 있지 않다. 업무가 바빠서일 수도 있고, 디자인 패턴을 적용하는것과 거리가 먼 외주 코드들이 많아서 그럴 수도 있다.  명백히 외주 계약에 디자인 패턴이 있지는 않기 때문.. 하지만 못쓰더라도 아는게 좋다고 생각 한다. 또한 자바의 Spring 코드를 까보면 여러 디자인 패턴의 결합체임을 알 수 있기에 좋은 공부라고 생각 한다. 디자인 패턴 강의 저자 링크드인 러닝과 같은 온라인 course의 특성상 내가 하고 싶으면 강의를 만들 수 있다. 이는 자칫 잘못하면 전문성이 떨어질수도 있는 점이 있다. 하지만 이 강의의 저자들은 Oreilly의 Head First Design을 작성한 저자이기 때문에 그런 걱정은 필요 없다.  강의 내용 - 6개의 패턴 해당 강의에서는 6개의 패턴을 공부 한다. Head First Design Pattern의 서적에는 약 20여가지의 패턴이 있으며 거기에서 6개를 뽑으신것 같다. 그냥 강의를 1,2,3 나누더라도 모든 강의를 올리는게 어땠을까 생각이 들긴 하지만, 대표적인 패턴을 배운 후 나머지들은 책을 통해서 확인하게 하는 의도라면 이해가 된다.  1. Strategy Pattern 함수의 interface를 통해서 객체를 상속하는 것이 객체 지향의 core중 하나 이다. 하지만 상속을 통해서 함수를 명세하는 것의 단점이 있는데 이는 모든 객체에서 해당 함수를 구현해야 한다는 점이다. 아무런 차이가 없더라도 일단은 따로따로 구현해야하는 점이 있으며 이를 재사용성이 좋게 하기 위해서 Composition이라고 하여 해당 기능을 하는 함수를 따로 클래스로 두어서 사용하는 것 이다.  IS-A 관계에서 HAS-A...

Java의 Spring에서 @RequestMapping가 구현되어 있는 방식을 알아보자.

java의 spring에 대하여 공부를 하고 있는 중이다. 요즘은 오픈소스를 사용하는 법 보다는 동작 원리 자체가 궁금한 상태 이다, 이에 대하여 가장 간단한 RequestMapping이라는 어노테이션을 보기로 정하였다. 해당 어노테이션은 스프링에서 지원해주는 기능이지만 다른 언어에도 mvc 프레임워크는 있으므로 이것만 알면 다른 언어에서의 동작 원리는 비슷하게 이해할 수 있으리라 본다. RequestMapping 매핑할 메서드에 아래와 같이 매핑을 시켜주면 스프링에서 알아서 읽어 들어와서 api를 생성해준다. @RequestMapping ( value= "/post" ) 여기서 내가 궁금해진 것은 @RequestMapping과 같은 Annotation을 도대체 누가 들고 오는건가 하는 생각이다. 어디선가 어떤 클래스가 알아서 파싱 할것 같지만 그 주체가 누군인지가 궁금하다. RequestMappingHandlerAdapter RequestMapping에 대한 공식 문서 를 확인해보면 해당 어노테이션을 어디서 사용 할 수 있는지 볼 수 있다. GetMapping들과 같은 어노테이션은 단순히 RequestMapping의 Get 기능인듯 하다. 여기서 보면 RequestMappingHandlerAdapter 가 연결되어 있음을 볼 수 있다. 공식 문서에서도 또한 RequestMapping을 서포트 한다고 작성되어 있다. 코드를 보니  RequestMappingHandlerAdapter의 코드에서 RequestMapping을 검색하면 직접적으로 해당 클래스를 가져오는것 같은 코드는 없다.  @Nullable private ControllerMethodResolver methodResolver ; C ontrollerMethodResolver 직접적으로는 안쓰지만 위의 ControllerMethodResolver 라는 클래스에서  getRequestMappingMethod라는 메서드를 통해서 가져오는듯 한 느낌이 있다. 해당 메서드를 확인...

Effective Java 2판 2장

현재 Effective Java 2판을 읽고 이에 대한 간단한 포스팅을 한다. 읽은 페이지는 4장 109페이지까지. 1장은 서론이니 생략 Start reading technical books 경험이 쌓이면서 이전에 읽었던 책이 기억이 잘 기억이 나지 않는다. 또한 지식에 따라 이해하는 내용이 다를 수 있다. 그렇기 때문에 읽었던 책을 다시 읽는 것을 목표로 하고 있다. Why This Book? 집에 많은 책이 있지만 이펙티브 자바와 같은 책은 자바의 특징이 담겨 있으나 어느정도는 대부분의 언어가 공유하는 내용을 담기도 한다. 그렇기 때문에 디자인 패턴을 담은 이책으로 시작하기로 한다. 2장 객체의 생성과 삭제 규칙 1 생성자 대신 정적 팩터리 메서드를 사용할 수 없는지 생각해보기 생성자를 안쓴다는 것은 new를 사용자가 하지 않는다는 것이고 호출하는 입장에서는 객체의 갯수를 조절할 수 없다. 객체를 무조건 하나만 쓰는 싱글턴이라거나 객체마다 커넥션을 유지하는 디비 연결같은 경우는 커넥션 풀을 사용하는데 이 경우에는 new를 조절해야한다. 사실 이 경우가 아니라더라도 굳이 new를 할 필요는 없다.  규칙 2 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하기 생성자의 인자가 많을때 생성자를 그대로 많게 하면 너무 많은 케이스를 고려해야하고 그렇다고 Set 메서드를 통해서 하면 객체가 너무 자주 바뀌게 된다. 따라서 Builder 패턴을 통해서 간단한 생성자만 두고 나머지는 나열하는 방식을 통해서 해결 한다.  규칙 3 private 생성자나 enum 자료형은 싱글턴 패턴을 따르도록 설계하기 여기서는 싱글턴을 구현하는 방법을 설명하고 있다. 클래스 내부에서 해당 인스턴스를 가지는 맴버 변수를 private로 하나 선언하고 사용할때는 해당 객체를 리턴하는 함수를 통해서 사용하면 된다. 규칙 4 객체 생성을 막을 때는 private 생성자를 사용하기 abstract로 선언해도 하위에...

Java Garbage Collection

이미지
Garbage Collection으로 인하여 프로그래머가 직접 Memory를 건들일은 없게 되었습니다. 그러나 명시적 Memory 해제보다 느리며 GC가 발생하는 순건 Suspend Time으로 인하여 다양한 문제가 발생하게 됩니다. Root Set과 Garbage Garbage 대상을 결정하는데에는 아래와 같은 구조를 기준으로 합니다. Local variable, Operand Stact등에서 해당 객체를 참조하고 있으면, Reachable으로 판단. 아직 메모리에 남아있으며, Native Method 영역으로 넘겨진 Object의 참조가 JNI 형태로 남아있으면 Reachable 메서드 영역에 로딩된 클래스 중 Constant pool에 있는 Reference 정보를 토대로 쓰레드 에서 직접 참조하진 않지만 constance pool을 통해 간접 link를 하고있는 객체는 Reachable 이라고 한다. Garbage Collection의 과정을 거치면 위의 Unreachable 객체를 제거하게 된다. 메모리 상에서 해당 객체를 지우면 당연히 단편화(Fragmentation)이 발생하게 되고 이를 위해 Compaction 알고리즘을 사용해야 한다. Hotspot JVM의 Garbage Collection GC 메커니즘은 두가지를 경험적 가설로 두고 있다. 대부분의 객체는 생성후 바로 Garbage가 된다. 오래된 객체가 새로운 객체를 참조할 일은 드물다. 첫번째 가설로 인하여 신생 객체들은 단편화를 자주 만들기에 eden 영역에 모아놓은 것이다. 두번째 가설의 경우 오래된 객체가 새로운 객체를 참조하는 경우가 발생할 경우 문제가 되는데, 그를 해결하기 위한 장치로 Card Table을 도입 하였다. Card Table Card Table Old Object가 Young Object를 참조하게 되면 dirty로 표기하여 해당 내용을 ...

JVM의 구조

이미지
현업에서 자바를 하지는 않고 있지만, 언젠가는  jvm이나 gc에 대한 지식이 필요할듯 하여 공부중 입니다. java에서 프로그램을 실행하면, 컴파일 과정에서 생긴 class 파일을 JVM으로 로딩하고 ByteCode를 해석을 하여 메모리 등의 리소스를 할당하는 등의 과정을 진행하게 됩니다. 이때 JVM은 Thread 관리, Garbage Collection과 같은 메모리 정리 과정도 진행 합니다. JVM 자바의 프로그램 실행은 아래의 과정을 거치게 됩니다. Java 프로그램 수행 과정 java source : 사용자의 코드 Execution Engine : 로딩된 클래스의 ByteCode를 해석 합니다. Runtime Data Area : JVM이 프로그램을 수행하기 위해 OS에서 할당받은 공간. 그중 Runtime Data Areas를 세부적으로 표현하면 다음과 같습니다. JVM Architecture Method : 클래스, 변수, 메서드, static, 상수 등이 들어감.(모든 쓰레드가 공유) Heap : new 명령어로 생성됨.(GC의 영역, 모든 쓰레드가 공유) Stack : 메서드 내에서 생성되는 값. LIFO로 진행. Native Method : 다른 언어등의 메서드를 호출하기 위한 공간. 이런 과정 중 Thread Synchronization과 Garbage Collection 등이 진행 됩니다. Java Heap 위의 구조 중 Heap 영역에서 instance와 array 객체를 저장하는 구조 이며, 그를 해제하는 과정은 JVM이 아닌 Garbage Collector를 통해서 진행이 됩니다. 위는 주로 사용되는 Hotspot JVM의 Heap 구조 입니다. Young Generation 은 eden과 survivor 영역으로 구성이 되며, eden은 Ob...