Java Stack
[Effective Java] 6장 enum 타입과 애너테이션 (Annotation)
[Effective Java] 6장 enum 타입과 애너테이션 (Annotation)
2019.12.31[Languages & Frameworks/Kotlin Java] - [Java] Enum 아이템 34. int 상수 대신 enum 타입을 사용하라 Planet.java 자바에서 enum을 뒷받침하는 아이디어는 다음과 같다. enum 타입 자체는 클래스이며, 상수 하나당 자신의 인스턴스를 하나씩 만들어 public static final 필드로 공개한다. ```java public enum Planet { MERCURY(3.3, 2.4); 이는 곧 public enum Planet { public static final Planet MERCURY = new Planet(3.3, 2.4); ``` enum 상수는 값 뿐만 아니라 로직도 가지고 있을 수 있다! abstract를 이용해서. Operation...
[Effective Java] 5장 제네릭
[Effective Java] 5장 제네릭
2019.12.11제네릭의 본질은, 런타임에 ClassCastException이 발생하는 것을 막아주어 타입 안전성을 높이는데 있다. 아이템 26. raw 타입은 사용하지 마라 (제네릭 쓸 때 를 빼먹지 않도록 주의해라) raw타입이란 ``java List``가 아니라 그냥 ``List``로, 제네릭을 타입 지정 없이 쓰는 것을 말한다. 이걸로 받으면 아무 타입이나 담을 수 있게 된다. 이는 타입 안전성을 해치게 된다. 예를 들어 List로 캐스팅해서 쓰면, List에 Integer를 넣을 수 있다! ```java List a = new ArrayList(); a.add("qwer"); List b = a; b.add(Integer.valueOf(333)); System.out.println(b.get(0)); Syste..
[Effective Java] 4장 클래스와 인터페이스
[Effective Java] 4장 클래스와 인터페이스
2019.12.05아이템 15. 클래스와 멤버의 접근 권한을 최소화하라 잘 설계된 컴포넌트는 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 완벽히 숨긴다. 필요한 것만 public으로 공개한다. 즉, 구현과 API를 깔끔히 분리하고 오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 개의치 않는다. 정보 은닉(=캡슐화) 개념. 메서드를 public으로 한다는건, 다른 컴포넌트가 이 메서드를 사용할 여지가 있다는 것이다. 이는 즉, 바꾸고 싶을 때 의존성 때문에 바꾸지 못하는 경우가 생기고, 지속적으로 관리해줘야 된다는 의미가 된다. 그래서 접근성은 가능한 한 낮게 할당하는 것이 좋다. private이라면 내부에서 언제든 변경 가능하기 때문에. 아이템 16. public 클래스에서는 pu..
[Effective Java] 3장 모든 객체의 공통 메서드
[Effective Java] 3장 모든 객체의 공통 메서드
2019.12.04아이템 10. equals는 일반 규약을 지켜 재정의하라 자바에서는 `` ==``의 동작이 두 가지다. 원시 타입에 사용할 경우, 두 피연산자의 값이 같은지 비교 (동등성, equality) 참조 타입에 사용할 경우, 두 피연산자의 주소가 같은지 비교 (참조 비교, reference comparision) equals는 두 객체가 물리적으로 같은가가 아니라 논리적 동치성을 확인해야 할 때 재정의 한다. equals 메서드를 재정의 할 때는 반드시 일반 규약을 따라야 한다. equals 메서드는 동치관계(equivalence relation)를 구현하며, 다음을 만족한다. ```java // x, y, z는 null이 아닌 참조 값이어야 함. Objects.requireNonNull() 사용 권장. 반사성..
[Effective Java] 2장 객체 생성과 파괴
[Effective Java] 2장 객체 생성과 파괴
2019.12.02아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라 GoF에 나오는 팩터리 메서드와는 다르다. public 생성자에 `` new``를 써서 객체를 만드는게 아니라, 아래 처럼 팩터리 메서드를 사용하는 것을 말함. public 생성자와 static factory 메서드는 각자 장단이 있지만, 후자가 유리한 경우가 더 많다. ```java public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } ``` 장점0. 같은 메서드 시그니처를 가진 목적이 다른 생성자를 만들 수 있다. 책에는 나와있지 않지만 실제로 이런 경우에도 유용하다. @Data public static class DataArea { private..
[Spring] Controller에서 사용하는 애너테이션
[Spring] Controller에서 사용하는 애너테이션
2019.09.25@ModelAttribute / @RequestBody 애너테이션은 웬만하면 붙여주는 편이 명확하다. @ModelAttribute를 명시하지 않아도 자동으로 URL 파라미터를 객체로 매핑해주고, GET은 관례적으로 URL 파라미터로 데이터를 전달하기 때문에, 굳이 @ModelAttribute를 사용해야 하느냐 라고 생각할 수 있는데 Controller에서 GetMapping 메서드는 사실 (URL 파라미터/HTTP 바디) 양 쪽 모두 데이터를 받을 수 있다. https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Summary_table 보면, GET의 경우 Request has Body가 No가 아니라 Optional로 되어 있다. POST, PUT도 마..
Spring AOP / @annotation resolve
Spring AOP / @annotation resolve
2019.07.30AOP란? Aspect Oriented Programming. 즉 관점 지향 프로그래밍이다. 이게 무슨 뜻인지 체감하려면 실사례를 생각해보는게 가장 좋다. 전문 통신 하는 상황을 생각해 보자. 전문 객체는 전문 필드 형식에 맞게 바이너리로 serialization 되어야 한다. ```java class telegramA { String field1; byte[] serialize() { field1이 길이가 4인지 체크하고 serialize } } class telegramB { String field1; byte[] serialize() { field1이 길이가 8인지 체크하고 serialize } } ``` telegramA의 field1은 length가 4여야 하고, telegramB의 field1..
Hystrix with Spring ( Circuit Breaker ) 를 사용할 때 주의해야 할 점.
Hystrix with Spring ( Circuit Breaker ) 를 사용할 때 주의해야 할 점.
2019.07.30기본 Hystrix 라이브러리는 직접 HystrixCommand를 상속받아 정의해서 써야 하므로 약간 번거롭다.Spring을 쓰고 있다면 @HystrixCommand 애너테이션으로 이런 번거로운 설정을 대신하는 라이브러리를 도입할 수 있다.아래 dependency를 추가하도록 하자. ```xml org.springframework.cloud spring-cloud-starter-netflix-hystrix 2.1.2.RELEASE````` spring-cloud-starter-hystrix``는 deprecated 되었기 때문에 `` spring-cloud-starter-netflix-hystrix``를 사용해야 한다는 점과, SpringBoot 2.x 대를 사용하고 있다면 hystrix 버전도 2.x...
[Spring] context.getBean() 사용하기
[Spring] context.getBean() 사용하기
2019.07.29Service 구현체가 많은 경우, 각각을 다 DI 하면 확장성이 떨어져 이를 Map에 담고 Interface로 꺼내 호출하는 방식을 자주 사용하게 된다. 다음과 같은 방법을 사용하면 Service Bean을 직접 불러올 수 있어 굳이 Map에 담지 않아도 사용 가능하다. 새로운 Service가 추가될 때 컨트롤러 쪽을 전혀 수정하지 않아도 되는 방식. (Map에 담는 방식은 생성자에서 map.put 해서 담아주어야 하니까...) ```java private final ApplicationContext context; // + DI ``` ```java PointChangeService pointChangeService = context.getBean(partnerCode + "PointChangeSer..
[Spring] DB 관련 : H2 설정
[Spring] DB 관련 : H2 설정
2019.07.23build.gradle에 다음을 추가. ``` runtimeOnly 'com.h2database:h2' // runtimeOnly 'com.h2database:h2:1.4.193' ``` 반드시 버전을 명시해줄 것. 버전 명시하지 않을 시 최신 버전이 설치되는데, 콘솔에서 connect해보면 자동으로 db 파일을 생성할 수 없어서 에러가 발생한다. :mem:을 써서 인메모리에 하든, :file:을 써서 파일로 저장하든 관계없이 에러가 발생함. 이는 어떤 취약점 때문에 자동으로 파일 생성하는걸 막아둬서 그렇다고 함. IFEXISTS 플래그를 주면 된다고 나와있는데 줘도 안됨. Database "mem:testdb" not found, and IFEXISTS=true, so we cant auto-creat..
RestTemplate 사용 시 ResponseType으로 generic 타입 받기 (ParameterizedTypeReference)
RestTemplate 사용 시 ResponseType으로 generic 타입 받기 (ParameterizedTypeReference)
2019.07.11Response를 받을 때 Generic 타입으로 매핑하여 받고 싶을 때가 있다. ```java DefaultResponseWrapper userInfoResponseWrapper = restTemplate.postForObject( userInfoUrl, new UserInfoRequest("MTA1", "HH_SERVICE", encryptedCi), DefaultResponseWrapper.class ); ``` 그러나 `` postForObject()`` 같은 함수는 generic이 들어간 타입을 응답으로 받을 수 없다. 위처럼 작성하면 오류가 발생한다. ParameterizedTypeReference를 사용하면 generic 타입을 응답으로 받을 수 있다. (generic 타입으로 매핑할 수 있..
[Spring] annotation : bean constraints, validation
[Spring] annotation : bean constraints, validation
2019.07.11beanvalidation.org/2.0/spec/#builtinconstraints https://www.baeldung.com/javax-validation @Size, @Past, @Min(1) @Pattern 등 애너테이션이 어떤 제약조건을 가지고 있는지 확인하려면 그냥 애너테이션 소스 확인해보면 된다. 참고로 `` @Email`` 애너테이션은 길이 제한도 겸하고 있다. `` {64}@{255}`` DB에 저장할 때도 VARCHAR2(320)으로 하면 깔끔하다. controller에서 data class 받으면서 한 번에 조건 체크 ```java @AssertTrue(message = "허용된 리스트 목록에 없는 코드") private boolean isInAllowList() { return !..