백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법
-
ExceptionHandler백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법 2020. 6. 16. 20:38
스프링 @MVC 예외 처리 방법 @ControllerAdvice @ExceptionHandler 스프링 부트가 제공하는 기본 예외 처리기 BasicErrorController 상속받아 사용 HTML과 JSON 응답 지원 커스터마이징 방법 ErrorController 구현 커스텀 에러 페이지 상태 코드 값에 따라 에러 페이지 보여주기 src/main/resources/static|template/error/ 404.html 5xx.html ErrorViewResolver 구현 예제 public class AppError { private String message; private String resaon; public String getMessage() { return message; } public vo..
-
클래스의 프록시백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법 2020. 6. 16. 20:19
자바에서는 다이내믹 프록시를 인터페이스로 만들어야 하지만 서브 클래스를 만들 수 있는 라이브러리를 사용하여 프록시를 만들 수 있다. CGlib https://github.com/cglib/cglib/wiki 스프링, 하이버네이트가 사용하는 라이브러리 버전 호환성이 좋치 않아서 서로 다른 라이브러리 내부에 내장된 형태로 제공되기도 한다. 예제 pom.xml 추가 cglib cglib 3.3.0 public class Book { String title = "clean code"; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } public class BookService..
-
다이내믹 프록시백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법 2020. 6. 16. 19:27
다이나믹 프록시란? 런타임에 인터페이스 또는 클래스의 프록시 인스턴스 또는 클래스를 만들어 사용하는 프로그래밍 기법 Java는 Interface가 아닌 class타입으로 다이나믹 프록시를 만들 수가 없다. https://docs.oracle.com/javase/8/docs/technotes/guides/reflection/proxy.html 다이나믹 프록시 사용처 스프링 데이터 JPA 스프링 AOP Mockito 하이버네이트 lazy initialzation 프록시 인스턴스 만들기 Object Proxy.newProxyInstance(ClassLoader, Interfaces, InvocationHandler) 예제 package com.example.demo; import java.lang.reflec..
-
리플렉션 정리백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법 2020. 6. 14. 17:16
리플렉션 사용시 주의할 것 지나친 사용은 성능 이슈를 야기할 수 있다. 반드시 필요한 경우에만 사용할 것 컴파일 타임에 확인되지 않고 런타임 시에만 발생하는 문제를 만들 가능성이 있다. 접근 지시자를 무시할 수 있다. 스프링 의존성 주입 MVC 뷰에서 넘어온 데이터를 객체에 바인딩 할 때 하이버네이트 @Entity 클래스에 Setter가 없다면 리플렉션을 사용한다. JUnit https://junit.org/junit5/docs/5.0.3/api/org/junit/platform/commons/util/ReflectionUtils.html 참고 https://docs.oracle.com/javase/tutorial/reflect/index.html
-
리플렉션 API 1부: 클래스 정보 수정 또는 실행백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법 2020. 6. 14. 16:14
Class 인스턴스 만들기 Class.newInstance()는 deprecated 됐으며 이제부터는 생성자를 통해서 만들어야 한다. 생성자로 인스턴스 만들기 Constructor.newInstance(params) 필드 값 접근하기/설정하기 특정 인스턴스가 가지고 있는 값을 가져오는 것이기 때문에 인스턴스가 필요하다. Field.get(object) Filed.set(object, value) Static 필드를 가져올 때는 object가 없어도 되니까 null을 넘기면 된다. 메소드 실행하기 Object Method.invoke(object, params) 예시 package kr.co.study; import java.lang.reflect.Constructor; import java.lang.re..
-
애노테이션과 리플랙션백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법 2020. 6. 14. 12:56
애노테이션이란? 어노테이션은 JEE5(Java Platform, Enterprise Edition 5)부터 새롭게 추가된 요소 근본적으로 주석이랑 같은 취급을 받는다. 기본적으로 클래스와 소스에서 정보가 존재하지만 바이트를 로딩하였을 때 메모리 상에는 남지 않는다. 중요 애노테이션 @Retention 해당 애노테이션을 언제까지 유지할 것인가? 소스, 클래스, 런타임 @Inherit 해당 애노테이션을 하위 클래스까지 전달할 것인가? @Target 어디에 사용할 수 있는가? @Override 선언한 메서드가 오버라이드 됨을 표시 만약 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생 @Deprecated 해당 메서드가 더 이상 사용되지 않음을 표시 만약 사용할 경우 ..
-
리플렉션 API 1부: 클래스 정보 조회백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법 2020. 6. 9. 09:00
리플렉션의 시작은 Class https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html Class에 접근하는 방법 모든 클래스를 로딩 한 다음 Class의 인스턴스가 생긴다. “타입.class”로 접근할 수 있다. 모든 인스턴스는 getClass() 메소드를 가지고 있다. “인스턴스.getClass()”로 접근할 수 있다. 클래스를 문자열로 읽어오는 방법 Class.forName(“FQCN”) 클래스패스에 해당 클래스가 없다면 ClassNotFoundException이 발생한다. Class를 통해 할 수 있는 것 필드 (목록) 가져오기 메소드 (목록) 가져오기 상위 클래스 가져오기 인터페이스 (목록) 가져오기 애노테이션 가져오기 생성자 가져오기 예시 ..