여러모로 사용되는 InitializeData

안상철·2023년 1월 7일
0

Kotlin Spring Boot

목록 보기
13/14
post-thumbnail

다른곳에도 활용되는지는 잘 모르겠지만,, 내 스승님인 차장님께서 전수 해 주신 지식을 기록하고자 한다!

Initialize 클래스인데, 직독직해하면 초기화하는 클래스라는 뜻이다.

기본 흐름이나 사용법은

  • 초기 프로젝트 생성 시 기초 데이터를 삽입해야 할 경우
  • 프로젝트가 Run 할 때 마다 실행되어야 할 경우

사용했었다.

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로 만들어 원하는 데이터를 원하는 만큼만 생성하고 원하는 시기에 작동할 수 있도록 변경했다.

profile
웹 개발자(FE / BE) anna입니다.

0개의 댓글