분류 전체보기
-
람다 정리 및 예시java 2021. 5. 19. 21:10
배경 고전적인 반복만 사용하던 옛날에 비해 최근에는 람다와 스트림으로 코드를 작성한다. 이제 눈에도 훨씬 잘 익고 오히려 단순 for문이 보기 어려울 정도가 되었다. 손과 눈에 익숙한 람다와 스트림에 대해 최근에 직격타를 맞았다. 내가 잘 알고 있는지에 대해 확인하는 시간이 있었고 난 그저 사용만 하고 있었다는 걸 알았다. 매번 써보고 공부하고 제대로 쓰자라는 나름대로 철학을 갖고 공부하지만 항상 그러지는 못하는 것 같다 ㅠㅠ. 특별히 람다와 스트림은 이전 나에 대한 속죄포 느낌으로 A부터 Z까지 공부하자! - 자바의 정석을 보며 공부하는 내용 람다식 람다식은 메서드를 반환형과 네임을 제외한 익명함수로 부를 수 있다. 정확히 말하면 익명클레스이지만 특정 상황에서 마치 익명함수처럼 사용할 수 있는 기능이다..
-
Spring @Scheduled 사용 및 동작원리spring/core 2021. 5. 19. 16:20
배경 프로젝트에서 멤버가 회원가입하고 로그인하는 과정을 살펴보자. 양식을 입력한 유저는 회원가입 요청을 서버에 하게 된다. 서버는 DB에 회원정보를 저장하는데 그 권한을 PRE로 설정하고 회원 이메일로 인증코드가 포함된 URL을 보낸다. 회원가입한 유저는 본인 이메일로 접속해 이 메일의 URL을 클릭하면 서버가 회원의 권한을 PRE에서 USER로 바꾸고 정상적으로 로그인을 처리할 수 있도록 하게 된다. 서버 내부적으로 유저이메일을 key값으로, 인증코드를 value로 외부 데이터베이스인 redis에 저장하게 된다. 만약 회원가입한 유저가 회원가입만 진행한 후 인증을 제때 처리하지 않으면 어떻게 될까? 레디스에 저장하는 인증코드는 적절한 expire를 갖는 게 맞다. 레디스 저장소가 expire된다면 유저..
-
Spring Interceptor 사용 및 동작 정리spring/core 2021. 5. 14. 10:59
배경 인터셉터가 서블릿에서 어떻게 동작하는지 실습해보자 인터셉터란? 필터, 인터셉터, AOP 모두 어떤 작업을 기준으로 전과 후에 부가기능을 추가해주는 작업을 한다. 필터는 서블릿 작업 전과후, 인터셉터는 핸들러매핑 작업 전과후, AOP는 메서드 처리 전과후에 부가기능을 추가한다. 핸들러매핑은 요청의 URL과 메서드로 구분되니 인터셉터도 비슷한 메카니즘으로 적용할 핸들러매핑을 정할 수 있다는 걸 알 수 있다. 실습 일단 /hello라는 GET 요청에 대해 "middle print!"를 출력해주는 핸들러매핑을 만들었다. 다음으로 HandlerInterceptor를 구현한 HelloInterceptor클래스를 만들고 preHandle()과 postHandle()를 오버라이딩했다. 한가지 특이한 점은 Hell..
-
Thread 정리java 2021. 5. 11. 15:55
배경 프로세스가 무엇인지 스레드가 무엇인지에 대한 내용은 여기서 다루지 않는다. 우선 java에서 스레드를 관리하기 위해 제공하는 객체가 무엇인지 확인하고 간단한 api사용법 및 스레드 상태에 대해 정리하도록 하자. 스레드 실행 스레드를 실행하기 위해서는 Thread.start()를 수행해야 한다. start는 내부적으로 run()을 호출하게 되는데 run()을 정의하기 위한 방법으로 Thread객체를 상속하거나 Runnable인터페이스를 구현해 재정의한 run()을 콜백으로 넘겨주는 방법이 있다. 전형적인 템플릿콜백 패턴이다. 참고로 한 스레드 당 한 번만 start()를 호출할 수 있다. 스레드는 스레드만의 독립적인 메모리 영역을 갖고 있고 고유한 이름이 있다. 따라서 Thread의 static메서드..
-
애너테이션 정리java 2021. 5. 11. 14:26
표준 애너테이션과 메타 애너테이션 표준 애너테이션 - @Override : 오버라이딩된 메서드임을 명시하여 컴파일러가 해당 클래스의 부모 메서드를 찾아 동일한 메서드 확인 - @Deprecated : 기능적으로 아무 의미 없으며 곧 사라질 것임을 사용자에게 알림 - @SuppressWarnings : 경고메세지를 없애도록 약속 - @FunctionalInterface : 함수형 인터페이스임을 알림 - @Native : native메서드에서 참조되는 상수 앞에 붙인다. 메타 애너테이션 메타 애너테이션은 애너테이션을 위한 애너테이션이다. 애너테이션에서 주로 쓰이는 속성을 정할 때 사용한다. @Target 애너테이션을 적용할 수 있는 대상을 지정한다. 대표적으로 타입, 필드, 메서드, 애너테이션, 파라미터 등..
-
컬렉션 정리java 2021. 5. 10. 15:29
배경 사실 각 컬렉션의 특징 및 사용법은 익숙하다 못해 손이 먼저 반응한다. 다만, 하는 것과 아는 건 다르고 또 그걸 입 밖으로 말하는 건 다른 문제니 깔끔하게 정리하고자 한다. 각 컬렉션의 구체적인 특징이나 사용법보다는 java.util의 구조와 낯선 인터페이스 위주로 정리한다. ArrayList add() 배열의 크기를 동적으로 변경하는 건 불가능하다. 리스트에 객체를 추가했을 때 capacity를 초과한 경우 grow()를 호출해 기존 배열을 복사하고 capacity를 1 추가한 새로운 배열을 얻는다. 리스트 생성 시 capacity의 값을 초기화하지 않으면 기본으로 10의 capacity가 할당된다. 애플리케이션의 성능을 고려한다면 넉넉한 capacity로 리스트를 선언하는 게 좋다. remov..
-
Java Garbage Collectorjava 2021. 5. 10. 12:21
Overview www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html 위 글 번역하며 공부 Purpose Hotspot JVM과 GC가 상호작용하는 기본 원리를 공부한다. 일단 이 기본을 공부하고 GC를 모니터링하며 종류별 GC에 대해 공부하자. Java Technology and the JVM Java Overview Java Runtime Edition java를 다운로드 받으면 Java Runtime Envirnment(JRE)를 얻는다. JRE는 Java Vitual Machine(JVM), 코어클래스, 플렛폼 라이브러리로 구성되어 있다. 3가지 구성요소가 Java를 돌리는 데 반드시 필요하다. Java Programmin..
-
스프링 DI 방법spring/core 2021. 5. 6. 17:00
배경 처음에 잘 배워서 그런지 스프링의 빈을 생성할 때 사용하는 DI방법에 대해 큰 고민을 하지 않았다. 당연히 롬복 + final + 생성자를 조합한 DI를 활용했다. 당연한 건 없다. 스프링이 제시하는 DI에는 어떤 게 있는지 그리고 왜 당연한 조합을 당연히 썼는지 생각하자. 필드 DI 공식문서에는 아예 소개된 방법도 아니고 인텔리제이는 필드 DI를 쓰지말라고 경고까지 한다. 그래도 필드 DI를 이용해 애플리케이션을 구동해보면 잘된다. 왜 스프링은 필드 DI를 DI방식에서 배제했을까? 장점 코드가 간결하고 의존성을 추가 또는 삭제해도 영향 받는 코드의 양이 적다. (관점에 따라 이건 단점이다-> 단일책임원칙 위배 가능성 up) 단점 우선 가장 큰 단점으로 필드 DI를 이용하면 반드시 스프링 컨테이너를..