분류 전체보기
-
HATEOAS(Hypermedia As The Engine Of Application State)백기선(인프런 강의)/스프링 부트 개념과 활용 2020. 6. 22. 12:11
Hypermedia As The Engine Of Application State Rest API를 만들 때, 서버 현재 리소스와 연관된 링크 정보를 클라이언트에게 제공 클라이언트 연관된 링크 정보를 바탕으로 리소스에 접근한다. EntityModel에 추가해서 리턴하는 식으로 구현하고, 클라이언트도 그걸 사용하는 방식이 Hateoas이다. ObjectMapper 제공하는 리소스를 Json으로 변환할 때 사용하는 인터페이스 객체를 Json으로 변환하거나 Json을 객체로 변환할 때 사용 LinkDiscovers XPath를 확장해서 만든 HATEOAS용 클라이언트 API rest api로 다른쪽 서버 api를 요청해서 받을 때, hateoas를 지원한다면 메소드를 이용해서 self에 해당하는 링크 정보를 ..
-
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..
-
프록시 패턴 - 백기선Java & 배경지식/패턴 2020. 6. 14. 17:42
프록시와 리얼 서브젝트가 공유하는 인터페이스가 있고, 클라이언트는 해당 인터페이스 타입으로 프록시를 사용한다. 클라이언트는 프록시를 거쳐서 리얼 서브젝트를 사용하기 때문에 프록시는 리얼 서브젝트에 대한 접근을 관리거나 부가기능을 제공하거나, 리턴값을 변경할 수도 있다. 리얼 서브젠트는 자신이 해야 할 일만 하면서(SRP) 프록시를 사용해서 부가적인 기능(접근 제한, 로깅, 트랜잭션, 등)을 제공할 때 이런 패턴을 주로 사용한다. 예제 public class Book { String title = "clean code"; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } ..
-
리플렉션 정리백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법 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 해당 메서드가 더 이상 사용되지 않음을 표시 만약 사용할 경우 ..