22/05/11 TIL-실무를 고급지게 만들어주는 기능들

김석진·2022년 5월 11일
0

다시 초심으로

목록 보기
11/19

LOMBOK

롬복을 맛보기전에 롬복을 쓰기전 데이터 객체를 하나 만들어보자

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을 구현해야한다..
이러면 객체 클래스의 코드 길이가 엄청 길어지게 된다.

이를 편하게 만들어주는 LOMBOK

보일러 플레이트(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")를 통해서 만들어 줄 수 있다..

간단하게 애노테이션을 추가를 하면서 Boilerplate Code를 줄일 수 있다..! 완전 혁명적이야!

Spring initializer를 제공해서 쉽게 Lombok을 추가할 수 있다! 얼마나 편한가

Lombok에서 제일 인기 있는 기능들

@Data

  • @Getter + @Setter + @RequiredArgsConstructor(필수 필드를 골라서 인자를 생성한 생성자를 만들어주는 애노테이션) +@ToStirng + @EqualsAndHashCode 기능을 담고 있다.
  • 편하지만 그래서 조심해야함 원하지 않은 기능들을 사용할 수 도 있다.

    @RequiredArgsConstructor

    스프링 생성자 주입에 어울려서 자주 쓰인다.

@Value

  • 불변객체를 만들때 사용한다.
  • @Getter+ @FieldDefaults(makeFinal=true, level= AccessLevel.PRIVATE) 모든 액세스레벨을 private final로 만들어주는 애노테이션+ @AllArgsConstructor + @ToString + @EqualsAndHashCode

그런데! 과도한 애노테이션, 관례기반코드스타일을 통해 동작 예측이 어렵다는 지적이 있었다.
명시적이고 테스트가 쉬운 코드로 회귀하려는 움직임이 있었다

LOMBOK을 사용하면서 예상치못한 사용예제

  1. final을 사용한 필드를 빌드업 패턴을 이용해 final 필드를 세팅안해도 실행이 된다!
  2. 필드에 세팅된 필드가 순서가 바뀌어도 생성자를 자동으로 만들어 주므로 코드가 오류가 나도 모르는경우가 많다(잠재적 에러가 발생할 수 있는데 컴파일 에러에서 모르는 경우가 많음)
  3. @ToString 순환참조 문제

    Car와 Seat를 만들었다 Seat안에는 Car를 연결해 줬다. 테스트를 할때 서로서로를 보는 코드를 작성했다. 이러면 순환참조 문제가 발생한다 (StackOverflowError)
    이러한 문제는 Spring Java JPA에 이러한 문제가 많이 발생하는 문제이다

@ToString 순환참조 문제의 해결


순환 참조문제가 넣는 필드를 @ToStrirng(exclude="필드명")을 통해서 해결 할 수 있다.
이방법의 단점은 필드를 문자열로 지정을 해서 필드명을 바꾼다면 exclude에 필드명을 바꿔야한다.

Spring Configuration Processor

외부 설정의 문서화

기존의 Spring boot properties이다


이렇게 문서화도 잘해주는것을 확인 할 수 있다.

Spring Configuration Processor

application.properties 또는 .yml 파일에 넣는 커스텀 설정의 자동완성 및 도움말 등을 지원한다.
Dependency 추가를 통해서 간편하게 추가를 할 수 있다.

Spring Cache Abstraction

Spring Cache Abstraction

애플리케이션에 투명하게 캐시를 넣어주는 기능이라고 공식문서에 적혀있다.
메소드와 클레스에 적용이 가능하고
캐시 인프라는 스프링 부트 자동설정으로 세팅이되고 프로퍼티로 관리가 가능하다

캐시가 시스템, 애플리케이션에 투명하게 자리 잡는다는 말?

이것은 데이터를 통신하는 시스템 쌍방이 캐시의 존재를 모른다는 의미다.
캐시가 있건 없건 시스템의 기대 동작은 동일해야한다.
캐시는 오로지 성능을 목적으로 작동을 해야한다.
캐시의 개념과 목적에 부합하는 성질이자 조건이다

반복작업이 일어난다면 캐시를 써보자

잘 바뀌지 않는 정보를 외부저장소에서 반복적으로 읽거나,
기대값이 어차피 같다면 캐싱을 해서 성능향상및 , I/O가 감소하는 것을 기대할 수 있다.

BUT! 얼마나 데이터가 자주 바뀌는지 알아야한다.

Spring boot Starter Cache-너무 쉬운 사용법이다.


사용은 너무 쉽다. @EnableCaching을 Configuration 클래스에 애노테이션을 추가한다.

캐시를 적용하고 싶은 클래스를 @Cacheable애노테이션을 붙이면 캐시를 적용 할 수 있다.

등록을 한뒤 print를 해보자

처음에는 저장소의 소스에는 가져오지만 저장소 소스에 가져오는 동작을 할 필요가 없으므로 그러한 비용을 줄이는 동작을 볼 수 있었다.

캐싱에서 생각해야하는것

  • 무엇을 캐시?
  • 얼마나 오랫동안 캐시할까?
  • 언제 캐시를 갱신할까?

Spring 에서 Cache를 구현하는 기능들

  • @EnableCaching - 캐시활성화
  • @Cacheable- 캐시 등록
  • @CacheEvict - 캐시를 삭제
  • @CachePut -캐시를 직접 갱신

Cache를 이야기하는 Redis를 이야기 안하면안돼..

Redis는 실무에서 사용하는 유명한 캐시서버중 하나이다.

Redis를 등록해보자

application.properties에 redis를 등록을 해보자
spring.cache.type = redis를 통해 일단 타입을 redis로 등록 (default는 simple이다)
spring.redis.host= localhost
spring.redis.prot=6379 등등
다른 기타 설정들은 필요할 때 사용하면 된다.

Redis 설치해보기


이렇게 redis를 다운로드해서 사용할 수 있다. 근데 나는 이거를 어캐 하는지 설치방법은 알아서 하길 바란다.

Redis 의존성 추가하기(build.gradle)

implementation 'org.sppringframework.boot::spring-boot-starter-data-redis'를 추가한다.

Redis는 외부와 응답을 하는 서버이기 때문에 Redis에 저장되는 캐시의 값들은 직렬화/ 역직렬화를 적용해야한다.

직렬화도 적용해보기

TTL 설정해보기 - 이것을 세팅을 하지않으면 서버에 캐시가 가득차게되어서 캐시를 비어내어야한다.

application.properties에서 설정을 할 수 있다.
물론 따로 Configuration을 이용해서 직렬화를 하지 않았다면

만약 이렇게 Configuration을 따로 만들어서 세팅을 해줬다면 .entryTtl 메소드를 이용해서 TTL을 세팅할 수 있다.
10 초후 캐시가 지워진것을 확인 할 수 있다.

Vault Configuration

암호를 관리하는법

DB 접근 암호를 어디에 관리하지..?
기존방법은

  • DB접속 코드에 직접 입력하거나
  • properties에 입력하거나
  • properties에 암호화하여 입력하거나
  • 별도의 DB에 저장
  • 배포 서버에 저장하는 방법을 사용했다.

Hashicorp Valut

민감 정보 관리에 사용하는 오픈소스 도구이다.

  • 민감 정보를 저장하고 관리하는게 주요 기능이다.
  • 민감 정보에 접근하는 인증/ 권한을 관리한다.
  • 데이터 암호화를 지원
  • 오픈소스이다!

Hashicorp Valut 의 장단점

장점

프로젝트와 민감 정보가 완전히 분리됨-> 보안성이 강화된다.
민감정보에 접근하고 고객과 공유할 수 잇는 다양한 방법을 사 용해 볼 수 있다.
민감 정보에 접근할 수 있는 권한 관리 기능

단점

설계에 따라 Valut서버가 죽으면 인증이 안되서 서비스가 중단되는 문제 발생
초기 러닝 커브
Valut서버를 별도로 운영해서 운영/관리에 대한 별도의 비용이 추가된다.

스프링 부트의 Valut 사용지원

  • Spring Valut : Valut연동을 위한 기본 기능 지원
    - spring-valut-core
  • Spring Colud Valut: Valut가 외부 환경(클라우드)에 있는 경우를 위한 추가적인 지원
    - Vault 각종 설정을 properties 기반으로 조작 가능하다.
    - spring- cloud-starter-valut-config
    - 그냥 이거쓰면된다.

Valut의 간단한 설정과 사용방법


물론 Dependency도 추가를 해야한다 ㅎㅎ
그리고 볼트 서버를 설치를 해야하는데 이거는 공식문서를 참고하자

결론

프로젝트를 오픈소스로 공개하고자 하는 경우
금융,상거래 관련 서비스를 하면서 민감 정보를 다룰때 (고객 개인정보등)
기타 서비스 도메인이 법에 민감한 분야라고 판단될때 제품코드와 민감정보를 분리하고자할때 도입을 검토해보자!

profile
주니어 개발자 되고싶어요

0개의 댓글