Java
-
@ControllerAdvice와 @ExceptionHandlerJava/Spring 2020. 7. 27. 18:04
■@ControllerAdvice란? Controller를 보조하는 어노테이션. Controller에서 쓰이는 공통 기능들을 모듈화하여 전역으로 쓰기 위해 사용. 아래 3개의 어노테이션을 지원한다. @ExceptionHandler @ExceptionHandler 뒤에 붙은 Exception이 해당 @Controller에서 발생했을 때, 그 Exception에 대한 전역적인 예외 처리를 할 수 있게 한다. @InitBinder 모델 검증과 바인딩을 하기 위한 어노테이션. JSR-303 빈 검증기능을 사용하는 스프링 validator를 사용할 수 있다. @ModelAttribute 도메인 오브젝트나 DTO프로퍼티에 요청 파라미터를 한 번에 받을 수 있는 @ModelAttribute를 전역으로 사용 가능하다...
-
N+1 쿼리 문제란?Java/Spring-JPA 2020. 7. 27. 11:47
N+1 쿼리 문제란? 1:N 관계인 두 엔티티가 있을 때, 1에 해당하는 엔티티를 N+1 in Lazy Loading N+1 in Eager Loading FetchType을 변경하는 것은 단지 N+1 발생 시점을 연관관계 데이터를 사용하는 시점으로 미룰지, 아니면 초기 데이터 로드 시점에 가져오느냐에 차이만 있는 것 N+1이 발생하는 이유? JPQL 입장에서는 즉시 로딩, 지연 로딩과 같은 글로벌 패치 전략을 무시하고 JPQL만 사용해서 SQL을 생성합니다. N+1 해결책 1 :: Fetch Join 가장 많이 사용하는 방법 페치 조인을 사용하게 되면 연관된 엔티티는 프록시가 아닌 실제 엔티티를 조회하게 되므로 연관관계 객체까지 한 번의 쿼리로 가져올 수 있습니다. N+1 해결책 2 :: @BatchS..
-
와일드카드 ? vs 정규 타입 매개변수 TJava/Basics 2020. 7. 22. 21:49
와일드카드 ? 와 정규 타입 매개변수 T의 차이를 살펴보자. ■Box 예제 먼저 Box라는 인터페이스와 Box를 rebox하는 메서드가 있다.public interface Box { T get(); void put(T element); } public void rebox(Box box) { box.put(box.get()); }rebox 메서드를 호출해본다고 생각해보자. 위 메소드의 호출부가 컴파일될 때, 매개변수의 와일드카드 타입이 결정된다. 그리고 box 내의 객체를 get 한 후 다시 push 한다. 별다른 오류가 없을 것 같지만 사실 다음과 같은 에러가 뜬다. Rebox.java:8: put(capture#337 of ?) in Box cannot be applied to (java.lang.Ob..
-
Java Thread(with Multi Thread)Java/Basics 2020. 6. 21. 20:29
■Thread란? 프로세스 내에서 실행되는 독립적인 흐름 단위. ■Thread 구현 방법 2가지 1. Thread class를 상속받는다. -> 다른 클래스를 상속받을 수 없다는 특징이 있다.public class ExtendedThread extends Thread { @Override public void run() { System.out.println("Thread를 상속받은 스레드 생성"); } }2. Runnable interface를 구현한 후 Thread class 생성자 매개변수에 넣는다. -> 구현하려는 클래스가 이미 다른 클래스를 상속하고 있을 때 사용한다.public class ImplementsThread implements Runnable { @Override public void..
-
같은 value 값을 가지는 String들의 hashcode가 같은 이유Java/Basics 2020. 6. 19. 13:31
같은 value 값을 가지는 String들의 hashcode가 같은 이유가 궁금해졌다. hashcode 대해 공부하던 도중 "test"와 new String("test")의 hashcode 값이 당연히 다를 줄 알았다. 왜냐하면 hashcode는 객체의 16진수 주소값을 10진수화 한 것이기 때문이다. "test"와 new String("test")는 저장되는 영역이 다르기 때문에 주소값도 다를 것이고 이에 따라 hashcode의 값도 달라야 한다는게 내 생각이었다. 하지만 결론부터 말하자면, 주소값은 다르지만 hashcode는 같았다. 왜 그럴까? ■hashcode 간단 설명 (String에서의 hashcode를 설명하기 위한 빌드업) 어떤 인스턴스는 주민등록번호와 같은 고유한 값을 가지고 있다. 그것..
-
메모리 주소만으로 Heap의 인스턴스에 접근할 수 있을까?Java/Basics 2020. 6. 17. 00:32
자바 스터디를 하던 중, 메모리 주소만으로 Heap의 인스턴스에 접근할 수 있을까? 라는 질문이 나와서 이에 대해 알아봤다. 결론은 접근할 수 없다 왜 그런지 살펴보자 ■개발자는 객체의 주소를 직접적으로 지정할 수 없다 개발자는 객체의 주소를 직접적으로 지정할 수 없다. 오직 간접적으로만 할 수 있다. 예를들어, String str = "hello"; 코드를 보면 "hello" 문자열의 메모리 주소가 str에 할당되고 있다. 이제 str은 메모리 주소를 갖게 된다. 그리고 String str2 = str; 코드를 보면 str이 가리키고 있는 주소가 str2에 할당되고 있다. "hello"라는 인스턴스를 복사하는 것이 아닌 "hello"의 주소를 복사하여 할당하는 것이다. 그러나 메모리 주소를 참조 변수에..
-
Java Heap DumpJava/Basics 2020. 6. 15. 22:18
■Memory Leak 프로그램이 OOM(Out Of Memory) 오류로 종료되거나 실행 속도가 저하되는 현상. 자주 발생하는 OOM 2가지 1. java.lang.OutOfMemorryError: heap space 2. java.lang.OutOfMemorryError: GC Overhead limit exceed 출처에 따르면, 자바 프로세스가 약 98%의 시간을 가비지 컬렉터를 실행하는데 소모하고 실행 이후에도 2% 이상의 힙 공간을 다섯 번 이상 확보하지 못할 때 이 예외가 발생한다. ■OOM에 대처하는 방법 프로그램이 OOM으로 인해 종료될 때 자동으로 당시의 메모리 정보를 파일(Heap Dump)로 남겨야 한다. -XX:+HeapDumpOnOutOfMemoryError 위 명령어를 프로그램..
-
JVM, JRE, JDKJava/Basics 2020. 6. 14. 23:29
■JVM이란? - Java Virtual Machine의 줄임말 - Java Byte Code(.class)를 각 OS에 맞게 해석하고, 해석된 코드의 실행 환경 구성 및 실행을 담당하는 가상 머신 (OS별 JVM 설치 필요) (아래에서 좀 더 자세히 살펴보자) ■JRE란? - Java Runtime Environment의 줄임말 - JVM과 자바 실행에 필요한 기본적인 클래스 라이브러리(Java Class Library)를 가지고 있다. - JRE를 다운로드받아 Java Byte Code(.class)를 실행시킬 수 있다. - Java파일을 컴파일할 수 없다.(Javac가 포함되어 있지 않음) - Oracle은 Java 11부터 JRE를 제공하지 않는다. Java 9 부터는 Jlink를 사용하여 커스텀..