DevTools는 리소스 변경 시 자동으로 서버를 재시작 해주며, Context에 instance 정보들을 저장하고 재사용 하여 서버 재시작 속도를 향상시켜 주는 기능을 합니다. 하지만, DevTools는 object deserialize 시에 casting이 잘 안되는 오류를 가지고 있습니다. (참조: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-devtools-known-restart-limitations) "ClassCastException: MyObject cannot be cast to MyObject" 라는 굉장히 희안한 오류 메시지를 보실 수 있습니다. DevTools는 내부적으로 두 개의 co..
JPA 사용 시 DB에서 조회된 엔터티를 view 단에서 사용해야 할 경우가 많이 생깁니다. 보통 jackson을 이용하여 json으로 parsing 후 사용하게 되는데, 엔터티간의 관계가 복잡할 경우 문제가 생길 수 있습니다. 예를들어 순환관계(A > B > C > A)나 양방향 관계(A B)를 가질 경우 자칫 잘못하면 json parsing 시 무한루프에 빠지게 됩니다. (이클립스가 뻗어 버리더군요...) 이를 방지하기 위한 방법으로 몇 가지가 있지만, 제가 사용한 방법은 다음과 같습니다. 1. OSIV disableOSVI는 transaction 밖에서도 lazy loading을 사용할 수 있도록 해주는 기능입니다. 이 기능을 사용하면 개발 시 편리한 점이 있지만, 자신의 컨트롤 밖의 문제가 생길 ..
Restful API 개발 참고 사항 요약 1. URI 구성- URI를 통해 특정 리소스를 명확하게 표현한다. 컬렉션은 복수형, 도큐먼트는 단수형을 사용/members/1/bookmarks/products/321/comments/2- 행위는 HTTP method를 이용한다. URI에 행위를 표현하는 동사형 단어가 사용되어서는 안된다.POST : insertPUT : updateGET : readDELETE : delete- 소문자만 사용하며, 가독성을 위해서 '-' (하이픈)을 사용할 수 있다. 2. HTTP Header 사용하여 응답 형태 구성- Accept-Header응답 파일 형태 (json, xml, text)- User-Agent접속 Client (PC / Mobile) 확인- Accept-La..
Method Overriding Overriding이란, 부모 class의 method를 자식 class에서 재정의 하여 사용하는 것을 말합니다. Overriding을 사용하는 이유는 부모 class 형으로 선언된 자식 인스턴스를 통일된 방식으로 사용하기 위함이라고 볼 수 있습니다. 대표적인 예로 도형을 그리는 로직이 있습니다. public class Test { public static void main(String[] args){List shapes = new ArrayList();shapes.add(new Circle());shapes.add(new Circle());shapes.add(new Rect());shapes.add(new Rect());for(Shape s : shapes) {s.dra..
String 객체 비교 Java에서 객체의 동등성을 비교하는 방법은 두 가지가 있습니다. 하나는 Object.equals 함수를 이용하는 것이고, 다른 하나는 == 연산자를 이용하는 방법입니다. == 연산자를 이용해서 두 개의 객체를 비교할 때에는 두 변수가 힙 메모리 상에 동일한 주소를 가르키고 있는지를 확인합니다. 그래서 같은 내용을 가진 객체라도 힙 메모리 상에 각자 올라가 있는 상태라면 == 연산자 비교시 false 값을 가지게 됩니다. String a = new String("hello");String b = new String("hello");a == b; //false new 키워드를 사용해서 객체의 인스턴스를 생성할 경우 힙 메모리 상에 해당 객체정보가 올라가고, 할당하고자 하는 변수에 그..
Java String #1 String은 Java에서 굉장히 많이 사용되는 변수 타입 중에 하나이며, 또한 관리되어야 할 리소스의 한 종류라고 할 수 있습니다. String은 Primitive 타입과 비슷한 성질을 가지기도 하고, 반면 일종의 class 처럼 동작하기도 합니다. 이런 특이상 성질을 가지고 있고, 잘못 사용하면 service에 잘못된 영향을 줄 수도 있는 String에 대하여 한번 알아보고자 합니다. - String은 변경 불가능 객체이다 (immutable) String 객체의 내부 값을 변경하는 것은 불가능하기 때문에, 문자열을 수정하는 모든 mathod는 수정된 새로운 문자열을 반환해 주는 방식으로 동작합니다. String으로 선언된 변수는 해당 변수에 새로운 String을 할당해 주..
프로젝트를 진행하다 보면, 클래스 생성에 필요한 초기값들이 점점 추가되고 옵션 값들이 많아지면서 생성자 오버로딩이 점점 많아지는 경우를 볼 수 있습니다. 생성자는 method 명으로 기능을 특정지을 수 없기 때문에, 가지고 있는 파라미터의 타입과 갯수만으로 구분해야 합니다. 주석으로 어느정도 가독성을 확보할 수 있지만, 많은 수의 오버로딩을 가진 생성자는 사용도 불편하고 보기에도 영 안 좋습니다. 클래스 생성 시에 다양한 옵션값을 사용해야 할 경우 적용 가능한 패턴이 바로 Builder 패턴 입니다. 객체 생성 시에 필수값만 입력하여 객체를 생성하고, 옵션값들은 필요시에만 설정 가능합니다. 다음과 같은 방식으로 사용 가능합니다.* Main.java public class Main { public stat..
Static factory method의 장단점 Static factory method란 객체의 인스턴스를 생성하는 방법 중에 하나입니다. public 생성자를 private으로 가려 놓고, 생성자로 사용하고자 하는 static method를 public으로 선언하여 해당 method만 이용해서 인스턴스를 생성하도록 하는 방식 입니다. 이런 방식을 사용함으로 인해 얻을 수 있는 이점이 몇 가지 있습니다. 1. 객체 생성에 대한 별도의 의미를 부여해 줄 수 있습니다. 생성자는 class 이름과 동일하기 때문에 특별한 의미를 부여하기 힘듭니다. 클래스의 생성자 시그너처를 여러개 만들어 각 시그너처 별로 기능을 다르게 하고 주석으로 의미를 설명해 줄 순 있지만, 클래스를 사용하는 입장에서 시그너처로 기능이 구..
Spring 사용 시 @Value 어노테이션을 이용해서쉽게 프로퍼티를 읽어 올 수 있습니다. 아래와 같은 방식으로 프로퍼티 파일의 내용을 주입시켜줄 수 있습니다. @Value("${property_name}") private String propertyName; 단, 참고해야 할 사항이 있습니다.@Value 어노테이션 web proejct 안에서 사용 시에는 sevlet context에 다음 내용이 필요합니다. Appliction Context에만 property로딩을 처리해서는Web project의 @Value로 해당 내용을 읽어올 수 없습니다.
Decorator, Adapter, Facade 패턴은 서로 비슷한 점을 가진 디자인 패턴입니다.세 패턴 모두 새로운 클래스로 기존의 클래스를 감싸는 방식이라는 공통점이 있습니다.기존 코드를 감싸는 방식은 상속이 아닌 구성(프로퍼티로 기존의 클래스의 인스턴스를 가지고 있음)을 사용합니다. 서로 비슷한 이 패턴들의 차이점을 정리해 보도록 하겠습니다. - Decorator 패턴기존 클래스를 감싸지만, 인터페이스는 그대로 유지하면서 새로운 기능을 추가하는 방식입니다.http://haloper.tistory.com/11 - Adapter 패턴기존 클래스의 인터페이스를 새로운 인터페이스로 변경할 때 사용합니다.기존의 개발된 클래스를 다른 인터페이스를 사용하는 클라이언트에서 사용 가능하도록중간에서 인터페이스를 변환..