Lombok, Spring Configuration Processor, Spring Cache, Vault 알아보기
09 Aug 2022패스트캠퍼스 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
필드에 추가
- 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}" } }