다른곳에도 활용되는지는 잘 모르겠지만,, 내 스승님인 차장님께서 전수 해 주신 지식을 기록하고자 한다!
Initialize 클래스인데, 직독직해하면 초기화하는 클래스라는 뜻이다.
기본 흐름이나 사용법은
사용했었다.
1번의 경우를 가장 많이 사용했고, 2번의 경우는 사용 할 케이스가 없었지만 잘 활용하면 매번 api를 켤 때마다 실행 해야하는 서비스를 추가 할 수도 있을 것 같아 기재했다.
거두절미하고 코드를 살펴보자
@Component
@Transactional
@Profile("initdb")
class InitializeData(
private val userRepository: UserRepository,
private val passwordEncoder: PasswordEncoder,
) : CommandLineRunner {
override fun run(vararg args: String?) {
initMember()
}
private fun initMember(): List<User> {
if (userRepository.findAll().isEmpty()) {
userRepository.saveAll(
listOf(
User(
userId = "uerr",
name = "사용자",
email = "user@email.co.kr",
password = passwordEncoder.encode("userPassword"),
roles = listOf(Role.ROLE_USER)
),
User(
userId = "admin",
name = "관리자",
email = "admin@email.co.kr",
password = passwordEncoder.encode("adminPassword"),
roles = listOf(Role.ROLE_SYS_ADMIN, Role.ROLE_USER)
)
)
)
return userRepository.findAll()
}
return emptyList()
}
}
@Component
어노테이션으로 스프링이 이 클래스를 읽을 수 있도록 한다.
@Transactional
어노테이션으로 이 클래스에서 트랜잭션이 일어남을 알려준다.
@Profile
어노테이션으로 특정 프로필로 api를 Run할 때 이 클래스가 활성화 될 수 있도록 하자
마지막으로 CommandLineRunner로 스프링이 구동될 때 특정 코드를 실행시킬 수 있도록 한다.
다음 흐름부터는 심플하다. 스프링이 Run 될 때 실행하고자 하는 코드를 마구마구 넣어주면 된다.
이 경우에서는 UserDB에 기본 사용자 두 명을 설정하는 것으로 예를 들었는데
실무에서는 이보다 훨씬 많은 비즈니스 로직을 처리하고 있다.
예로 대학원 선발심사 프로젝트는 내가 주로 맡고 있는 프로젝트인데 규정상 사용자 및 평가정보를 저장하고 있을 수 없어 매번 DB를 새로 만든다. 사용자도 미리 넣어줘야하고 평가를 위한 피벗테이블 등등..
보안상 전부 말할 순 없지만 서비스를 시작하기 위해 필요한 모든 준비를 이 클래스에서 담당했었다. 지금은 api로 만들어 원하는 데이터를 원하는 만큼만 생성하고 원하는 시기에 작동할 수 있도록 변경했다.