Lombok, Spring Configuration Processor, Spring Cache, Vault 알아보기

패스트캠퍼스 Spring Boot 강의 정리

Lombok

  • boilerplate 코드를 줄여주는 도구
  • 생산성 향상
  • getter, setter, toString, builder, 불변 객체 등 가능
  • @Data
    • @Getter + @Setter + @RequiredArgsConstructor + @ToString + @EqualsIsAndHashCode
    • 편하지만 조심해서 사용해야 함
  • @Value
    • 불변 객체 만들 때 사용
    • @Getter + @FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE) + @AllArgsConstructor + @ToString + @EqualsIsAndHashCode
  • @RequiredArgsConstructor
    • 생성자 주입에 주로 사용
  • 단점
    • 예상치 못한 동작
    • 과도한 애노테이션 & 관례 기반 코드 스타일로 동작 예측이 어려움
    • 명시적이지 않고 테스트가 편리하지 않음
    • @ToString의 순환 참조 문제
      • exclude 속성으로 해결 가능 또는 @ToString.Exclude 필드에 추가

Spring Configuration Processor

  • application.properties 또는 application.yml 에 넣는 커스텀 설정의 자동 완성 & 도움말 지원
  • resources/META-INF/spring-configuration-metadata.json에 형식에 맞춰서 더 상세한 설명 추가 가능
  • annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
@Getter
@ConstructorBinding
@ConfigurationProperties("my")
public class MyProperty {
  
  // 아래의 주석 내용이 설정에서 설명으로 나오게 됨
  /** 이름입니다 */
  private final String name;
  
  public MyProperty(String name) {
    this.name = name;
  }
}

Spring Cache Abstraction

  • 애플리케이션에 투명하게 캐시를 넣어주는 기능
    • 데이터를 통신하는 양방향의 시스템이 캐시의 존재를 모름
    • 캐시 유무와 상관없이 시스템의 기대 동작이 동일함
    • 캐시의 목표는 성능
  • 주요 기능
    • @EnableCaching : 캐시 활성화
    • @Cacheable : 캐시 등록
    • @CacheEvict : 캐시 삭제
    • @CachePut : 캐시 수정
  • 메소드와 클래스에 적용 가능
  • 스프링 컨테이너에서 모든 빈이 로드된 후에 활성화됨
  • 스프링 부트 자동 설정으로 세팅
  • 프로퍼티로 관리 가능
  • 캐시를 사용하면 좋은 경우
    • 잘 바뀌지 않는 정보를 외부 저장소에서 반복적으로 읽어올 때
    • 기대값이 같을 때
    • 캐싱으로 성능 향상 및 I/O 감소
// Main class
@EnableCaching
@SpringBootApplication
public class SampleApplcation {
  
}

// Student
@Data
public class Student implements Serializable {
  private String name;
}

// Repository
@RequiredArgsConstructor
@Repository
public class StudentRepository {
  
  private final Map<String, Student> storage;
  
  @Cacheable("student")
  public Student getStudent(String name) {
    return storage.get(name);
  }
}

Redis

  • 의존성만 추가하면 레디스에 캐싱됨
dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-redis
}
  • Jackson serializer 설정
// config
@EnableCaching
@Configuration
public class RedisConfig {

    @Bean
    public RedisCacheConfiguration redisCacheConfiguration() {
        return RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(SerializationPair
                        .fromSerializer(new GenericJackson2JsonRedisSerializer()));
    }
}

// Student
@Data
@NoArgsConstructor
public class Student {
  private String name;
}
  • 레디스 키 설정
    • 따로 설정이 없으면 :: 형식으로 됨
@EnableCaching
@Configuration
public class RedisConfig {

    @Bean
    public RedisCacheConfiguration redisCacheConfiguration() {
        return RedisCacheConfiguration.defaultCacheConfig()
          			.computePrefixWith(name -> name + ":")
                .serializeValuesWith(SerializationPair
                        .fromSerializer(new GenericJackson2JsonRedisSerializer()));
    }
}
  • redis TTL 설정
    • 레디스 설정을 수동으로 하지 않았으면 application.properties나 application.yml에 설정
    • spring.cache.redis.time-to-live
    • 커스텀 설정했을 경우, 코드로 설정
@EnableCaching
@Configuration
public class RedisConfig {

    @Bean
    public RedisCacheConfiguration redisCacheConfiguration() {
        return RedisCacheConfiguration.defaultCacheConfig()
          			.entryTtl(Duration.ofSeconds(10))
                .serializeValuesWith(SerializationPair
                        .fromSerializer(new GenericJackson2JsonRedisSerializer()));
    }
}

Vault Configuration

  • 민감 정보 저장 & 관리
  • 민감 정보에 접근하는 인증 & 권한 관리
  • 데이터 암호화
  • 장점
    • 프로젝트와 민감 정보 분리
    • 보안성 강화
    • 민감 정보에 접근하고 고객과 공유할 수 있는 다양한 방법 사용 가능
    • 민감 정보에 접근할 수 있는 권한 관리 가능
  • 단점
    • 설계에 따라서 vault 서버가 죽을 경우, 인증이 안 되어 서비스 중단되는 문제 발생
    • 러닝 커브
    • vault 서버 별도 운영
  • 공식 홈페이지
  • spring vault
    • 스프링 부트 vault 지원
    • spring-vault-core'
    • Spring Vault
  • spring cloud vault
    • vault가 외부 환경에 있을 경우를 위해 추가적 지원
    • valult 설정을 properties 기반으로 조작 가능
    • Spring Cloud Vault
    spring.config.import=vault://
    spring.cloud.vault.scheme=http
    spring.cloud.vault.authentication=token
    spring.cloud.vault.token=asdf123
    
    ext {
      set('springCloudVersion', "2021.0.3")
    }
      
    dependencies {
      implementation 'org.springframework.cloud:spring-cloud-starter-vault-config'
      testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }
      
    dependencyManagement {
      imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
      }
    }