스프링 초기 데이터 세팅하는 방법 정리

들어가며

개발을 하고 나서 납품일정이 되면 자연스럽게 활용하던 DB가 아닌 새롭게 세팅된

DB로 깔끔하게 밀어서 준다.

이때 여러가지 정보들을 미리 등록해야하는 경우가 있는데 필자는 SQL로 간단하게

만들어서 넣어주고 있었는데 문득 더 쉽게하는 방법은 없을까?

(절때 DDL 쿼리 작성해서 귀찮은건 아님 .ㅋ.)

해서 찾아본걸 정리해본다.

.SQL 파일로 하기

그냥 일반적으로 파일 저장해두는 resources 아래나 루트 경로 쪽에

sql파일에 쿼리 짜서 넣어준다

쉽긴한데 문제가 만약 기존 데이터가 있는 경우 아주 가끔 (사실 한번) 모든 데이터를

지워버리는 경우가 생겨서 만약 기존 데이터는 유지시키면서 설정한 데이터를 넣어줄 때는

신경써서 관계도를 보며 해야한다.

@PostConstruct 사용 방법

 @PostConstruct
    public void initAdminUser() {
        String adminId = "admin";

        if (userRepository.existsById(adminId)) {
            log.info("관리자 계정이 이미 존재합니다. 초기화 생략.");
            return;
        }

        String salt = saltUtil.generateSalt();
        String encryptedPassword = passwordEncryptorUtil.encryptPassword("1234", salt);

        User adminUser = User.builder()
                .userId(adminId)
                .userName("관리자")
                .password(encryptedPassword)
                .salt(salt)
                .userInfo("시스템 관리자")
                .userRole(UserRole.MASTER)
                .build();

        userRepository.save(adminUser);
        log.info("관리자 계정이 성공적으로 생성되었습니다. ID: {}, Role: {}", adminId, adminUser.getUserRole());
    }
}

예를 들어 이렇게 초기 세팅을 잡는다고 했을때

@PostConstruct의 경우 빈 초기화 시점에서 시작되기 때문에 빠르게 초기 세팅을 할 수 있다는 장점이 있다.

해당 어노테이션은 사실 RabbitMQ를 쓰다가 메시지 큐를 초기화 시키는게 필요하는 기능을 추가하다가

사용했던 경험이 있었는데 이게 빈생성이후 초기 데이터로 밀어서 사용할 수 있다는 점을 활용해서

초기데이터 세팅하는 방법으로도 사용해볼 수 있다.

CommandLineRunner 사용 방법

필자가 사용해본 새로운 방법인데

public class UserDataInitializer implements CommandLineRunner {

    private final UserRepository userRepository;
    private final SaltUtil saltUtil;
    private final PasswordEncryptorUtil passwordEncryptorUtil;

    @Override
    public void run(String... args) throws Exception {
        String adminId = "admin";

        // 이미 등록된 admin 사용자가 있는지 확인
        if (userRepository.existsById(adminId)) {
            log.info("관리자 계정이 이미 존재합니다. 초기화 생략.");
            return;
        }

        // 초기 사용자 설정 (admin, 1234, role: MASTER)
        String salt = saltUtil.generateSalt();
        String encryptedPassword = passwordEncryptorUtil.encryptPassword("1234", salt);

        User adminUser = User.builder()
                .userId(adminId)
                .userName("관리자")
                .password(encryptedPassword)
                .salt(salt)
                .userInfo("시스템 관리자")
                .userRole(UserRole.MASTER)
                .build();

        // 데이터베이스에 저장
        userRepository.save(adminUser);
        log.info("관리자 계정이 성공적으로 생성되었습니다. ID: {}, Role: {}", adminId, adminUser.getUserRole());
    }
}

이런식으로 사용해볼 수 있다.

동작은

  • 애플리케이션 시작 시 자동 실행.
  • 기존에 admin 사용자가 있으면 초기화 생략.
  • Salt 생성 및 비밀번호 암호화 후 저장.
  • 로그를 통해 정상 저장 여부를 확인.

이렇게 된다. 가장 좋은점은 자동으로 실행되고, 체크로직이 타져서 sql처럼 밀어버리는 경우도 없고

확장해서 사용하는 개념이기 때문에 안정적으로 사용할 수 있다는 장점이 있다.

'Spring - Spring Boot' 카테고리의 다른 글

AOP 활용 방법 - Spring Boot  (0) 2025.04.03
GlobalException으로 예외처리하기  (0) 2025.02.17
Spring 과 톰캣  (1) 2025.01.08
@PrePersist에 대하여  (0) 2025.01.07
Spring - Spring Boot - Swagger 설정하기  (0) 2024.12.12