-
[스프링 인 액션] Chapter 1 - 스프링 시작하기 :: 스프링이란?개발서적읽기/Spring in Action 제 5판 2020. 7. 28. 13:29
■스프링 애플리케이션 컨텍스트 스프링은 스프링 애플리케이션 컨텍스트라는 컨테이너를 제공한다. 이 컨테이너는 컴포넌트들을 생성하고 관리한다. 그리고 컴포넌트 또는 빈들은 스프링 애플리케이션 컨텍스트내부에서 서로 연결되어 완전한 애플리케이션을 만든다. 이 상호 연결은 의존성 주입이라고 알려진 패턴을 기반으로 수행된다. 즉 컴포넌트와 컴포넌트가 의존하는 관계를 스프링 애플리케이션 컨텍스트라는 컨테이너가 담당하여 수행한다. 스프링 애플리케이션 컨텍스트는 모든 컴포넌트의 생성, 관리를 담당하고 해당 컴포넌트를 필요로 하는 빈에 주입(연결)한다. ■스프링의 자동-구성 스프링은 스스로 컴포넌트들을 구성한다. 이 기능을 자동-구성이라고 한다. 스프링의 자동-구성 기능 덕분에 스프링을 사용하는 개발자는 별도의 빈 상호 ..
-
[이펙티브 자바] item 32 - 제네릭과 가변인수를 함께 쓸 때는 신중하라개발서적읽기/Effective Java - temp 2020. 7. 27. 22:50
■가변인수란? 가변인수는 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해주는 기법이다.static void test(List... param) { }가변인수 메서드는 제네릭과 함께 자바5에 추가되었다. 아쉽게도 이 둘은 서로 잘 어우러지지 않는다. ■가변인수의 허점 가변인수는 구현 방식에 허점이 있다. 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어진다. 그런데 내부로 감춰야 했을 이 배열이 클라이언트에 노출된다는 단점이 있다. 그 결과 varargs 매개변수에 제네릭이나 매개변수화 타입이 포함되면 알기 어려운 컴파일 경고가 발생한다.거의 모든 제네릭과 매개변수화 타입은 실체화되지 않는다. (item 28에서 실체화 불가 타입은 런타임에는 컴파일타임보다 타입 관..
-
@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..
-
[이펙티브 자바] item 26 - 로 타입은 사용하지 말라개발서적읽기/Effective Java - temp 2020. 7. 19. 23:21
■제네릭 관련 용어 정리 한글 용어 영문 용어 예 정규 타입 매개변수 formal type parameter E 제네릭 타입 generic type List 실제 타입 매개변수 actual type parameter String 매개변수화 타입 parameterized type List 한정적 타입 매개변수 bounded type parameter 재귀적 타입 한정 recursive type bound 비한정적 와일드카드 타입 unbounded wildcard type List 한정적 와일드카드 타입 bounded wildcard type List다. 이것이 어떤 타입이라도 담을 수 있는 가장 범용적인 매개변수화 Set 타입이다. 다음은 비한정적 와일드카드 타입을 사용해 선언한 메소드이다.static i..
-
[이펙티브 자바] item 14 - Comparable을 구현할지 고려하라개발서적읽기/Effective Java - temp 2020. 7. 9. 00:28
■Comparable 인터페이스public interface Comparable { /** * Compares this object with the specified object for order. Returns a * negative integer, zero, or a positive integer as this object is less * than, equal to, or greater than the specified object. * * The implementor must ensure sgn(x.compareTo(y)) == * -sgn(y.compareTo(x)) for all x and y. (This * implies that x.compareTo(y) must throw an excep..
-
[이펙티브 자바] item 9 - try-finally보다는 try-with-resources를 사용하라개발서적읽기/Effective Java 3E 2020. 6. 29. 00:11
■자원 닫기의 중요성 InputStream, OutputStream, java.sql.Connection 등은 close 메소드를 호출해서 직접 닫아줘야 한다. 그런데 깜빡하고 자원을 닫지 않으면 예측할 수 없는 성능 문제로 이어질 수 있다. 이 상황을 방지하기 위해 finalizer를 활용할 수도 있지만 좋은 방법이 아니다. (item 8) 일반적으로 자원을 닫는 두가지 방법이 있다. 전통적인 방법인 try-fianlly와 java 7 이후 사용할 수 있는 try-with-resources이다. ■자원을 닫는 전통적인 방법 :: try-finallystatic String firstLineOfFile(String path) throws IOException { BufferedReader br = new..