롬복을 맛보기전에 롬복을 쓰기전 데이터 객체를 하나 만들어보자
public class Student{
private String name;
private Integer age;
private Grade grade;
private enum Grade{
A,B,C,D,F
}
getter/ setter를 추가를 해야 이 객체를 세팅하고 값들을 가져올수 있다..
동일한 학생 판단은 뭘 기준으로 할까..? equals/hashcode를 구현해야한다.
로그 출력을 할때 toString을 구현해야한다..
이러면 객체 클래스의 코드 길이가 엄청 길어지게 된다.
보일러 플레이트(Boilerplate Code)를 줄여주는 도구이다
생산성 향상에 기여를 하는 아주 편리한 도구이다.
위 의 코드를 롬복으로 구현해보자
@Data
@Builder
public class Student{
private String name;
private Integer age;
private Grade grade;
private enum Grade{
A,B,C,D,F
}
isEquals, toString, getter/setter.... 등등 @Data 애노테이션을 통해서 간략하게 만들어 준다.
불변객체 또한 @value(staticConstructor="of")를 통해서 만들어 줄 수 있다..
Spring initializer를 제공해서 쉽게 Lombok을 추가할 수 있다! 얼마나 편한가
@RequiredArgsConstructor
스프링 생성자 주입에 어울려서 자주 쓰인다.
그런데! 과도한 애노테이션, 관례기반코드스타일을 통해 동작 예측이 어렵다는 지적이 있었다.
명시적이고 테스트가 쉬운 코드로 회귀하려는 움직임이 있었다
순환 참조문제가 넣는 필드를 @ToStrirng(exclude="필드명")을 통해서 해결 할 수 있다.
이방법의 단점은 필드를 문자열로 지정을 해서 필드명을 바꾼다면 exclude에 필드명을 바꿔야한다.
기존의 Spring boot properties이다
이렇게 문서화도 잘해주는것을 확인 할 수 있다.
application.properties 또는 .yml 파일에 넣는 커스텀 설정의 자동완성 및 도움말 등을 지원한다.
Dependency 추가를 통해서 간편하게 추가를 할 수 있다.
애플리케이션에 투명하게 캐시를 넣어주는 기능이라고 공식문서에 적혀있다.
메소드와 클레스에 적용이 가능하고
캐시 인프라는 스프링 부트 자동설정으로 세팅이되고 프로퍼티로 관리가 가능하다
이것은 데이터를 통신하는 시스템 쌍방이 캐시의 존재를 모른다는 의미다.
캐시가 있건 없건 시스템의 기대 동작은 동일해야한다.
캐시는 오로지 성능을 목적으로 작동을 해야한다.
캐시의 개념과 목적에 부합하는 성질이자 조건이다
잘 바뀌지 않는 정보를 외부저장소에서 반복적으로 읽거나,
기대값이 어차피 같다면 캐싱을 해서 성능향상및 , I/O가 감소하는 것을 기대할 수 있다.
사용은 너무 쉽다. @EnableCaching을 Configuration 클래스에 애노테이션을 추가한다.
캐시를 적용하고 싶은 클래스를 @Cacheable애노테이션을 붙이면 캐시를 적용 할 수 있다.
등록을 한뒤 print를 해보자
처음에는 저장소의 소스에는 가져오지만 저장소 소스에 가져오는 동작을 할 필요가 없으므로 그러한 비용을 줄이는 동작을 볼 수 있었다.
Redis는 실무에서 사용하는 유명한 캐시서버중 하나이다.
application.properties에 redis를 등록을 해보자
spring.cache.type = redis를 통해 일단 타입을 redis로 등록 (default는 simple이다)
spring.redis.host= localhost
spring.redis.prot=6379 등등
다른 기타 설정들은 필요할 때 사용하면 된다.
이렇게 redis를 다운로드해서 사용할 수 있다. 근데 나는 이거를 어캐 하는지 설치방법은 알아서 하길 바란다.
implementation 'org.sppringframework.boot::spring-boot-starter-data-redis'를 추가한다.
Redis는 외부와 응답을 하는 서버이기 때문에 Redis에 저장되는 캐시의 값들은 직렬화/ 역직렬화를 적용해야한다.
application.properties에서 설정을 할 수 있다.
물론 따로 Configuration을 이용해서 직렬화를 하지 않았다면
만약 이렇게 Configuration을 따로 만들어서 세팅을 해줬다면 .entryTtl 메소드를 이용해서 TTL을 세팅할 수 있다.
10 초후 캐시가 지워진것을 확인 할 수 있다.
DB 접근 암호를 어디에 관리하지..?
기존방법은
민감 정보 관리에 사용하는 오픈소스 도구이다.
프로젝트와 민감 정보가 완전히 분리됨-> 보안성이 강화된다.
민감정보에 접근하고 고객과 공유할 수 잇는 다양한 방법을 사 용해 볼 수 있다.
민감 정보에 접근할 수 있는 권한 관리 기능
설계에 따라 Valut서버가 죽으면 인증이 안되서 서비스가 중단되는 문제 발생
초기 러닝 커브
Valut서버를 별도로 운영해서 운영/관리에 대한 별도의 비용이 추가된다.
물론 Dependency도 추가를 해야한다 ㅎㅎ
그리고 볼트 서버를 설치를 해야하는데 이거는 공식문서를 참고하자
프로젝트를 오픈소스로 공개하고자 하는 경우
금융,상거래 관련 서비스를 하면서 민감 정보를 다룰때 (고객 개인정보등)
기타 서비스 도메인이 법에 민감한 분야라고 판단될때 제품코드와 민감정보를 분리하고자할때 도입을 검토해보자!