기능을 점진적으로 개선하다보니 데이터베이스 스키마를 변경하는 경우가 많다. 데이터베이스 스키마를 변경할 때마다 데이터베이스 migration이 많이 발생한다. 데이터베이스에서 쿼리를 활용해 실행하는 경우는 간단하지만 애플리케이션 로직을 활용해 처리하는 경우가 종종 있다. 이 때마다 매번 Controller를 추가하고 코드를 추가하는 것이 귀찮아서 이번 기회에 migration을 전담하는 Controller를 만들고 권한 처리까지 추가했다.
package net.slipp.web.qna;
import javax.annotation.Resource;
import net.slipp.service.qna.MigrationService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/migrations")
public class MigrationsController {
@Resource(name = "migrationService")
private MigrationService migrationService;
@RequestMapping("")
public String index() {
return "redirect:/";
}
}
위와 같이 Controller를 추가하고 권한 처리는 Spring Security 설정에서 다음과 같이 추가했다.
<security:http use-expressions="true"
entry-point-ref="springSocialSecurityEntryPoint" xmlns="[http://www.springframework.org/schema/security">](http://www.springframework.org/schema/security">)
[...]
<intercept-url pattern="/migrations/ *" access="hasRole('ROLE_ADMINISTRATOR')" />
</security:http>
위와 같이 설정을 추가해 놓으면 migration 작업은 관리자 권한을 가지는 사용자만 진행할 수 있다.
나는 데이터베이스 migration 작업은 migration 작업을 위한 코드를 추가하고 배포한 후 migration 작업 완료. migration 소스 코드 제거하고 다시 배포한다. 이와 같이 점진적인 데이터베이스 리팩토링을 진행하려면 자동화된 테스트 코드와 자동화된 배포는 반드시 갖춘 상태에서 가능하다. 지금 slipp.net 배포는 무중단 배포까지 하는 상태는 아니지만 자동화된 테스트와 배포 환경은 갖추고 있는 상태이다.
1개의 의견 from FB
3개의 의견 from SLiPP
간단한 것은 상관없지만, 가능하면 마이그레이션은 웹서버에서 하지 않는 것이 어떨까요? 마이그레이션하는 작업이 서비스와 무관할 수는 없지만 조금이라도 영향도를 줄일 수 있도록 별도의 어플리케이션으로 실행하는 것을 권장합니다.
@ologist 나도 그 부분에 대해서는 공감하지만 별도의 어플리케이션을 유지하려면 아무래도 비용도 발생하니 지금 slipp.net과 같은 작은 곳에서는 웹 서버에서 그냥 진행하도록 하는 것이 편하지 않을까? 추후 서비스도 커지고 사용자도 증가한다면 그 시점에 별도의 어플리케이션 운영하는 것을 고민해도 되지 않을까?
데이터베이스를 remote에 접근하고 내 local 컴에서 migration 작업을 돌리려고 할까 하다가 아무래도 데이터를 오픈하는 것보다는 웹 서버에 같이 배포하는 방식을 취했다. 추후 별도의 어플리케이션으로 분리해야 한다고 생각한다.
@자바지기 네 간단하다는 것이 slipp같은 것을 얘기한 것입니다. 다만, 반복적으로 발생한다면 간단하게 어플리케이션을 구현하는 것은 운영상 유연성과 의존성 관리 측면에서는 더 나아보였습니다.
의견을 남기기 위해서는 SLiPP 계정이 필요합니다.
안심하세요! 회원가입/로그인 후에도 작성하시던 내용은 안전하게 보존됩니다.
SLiPP 계정으로 로그인하세요.
또는, SNS 계정으로 로그인하세요.