Spring Boot: 어플리케이션 2개로 프로젝트 관리 심화하기

by SLV Team 37 views

자, 여러분! 오늘은 Spring Boot 프로젝트를 더욱 깊이 있게 관리하는 방법에 대해 이야기해볼까 합니다. 특히, 두 개의 어플리케이션(a, b)을 생성하여 프로젝트를 체계적으로 관리하고, Docker를 활용해 배포까지 용이하게 만드는 방법에 대해 자세히 알아볼 거예요. Spring BootDocker의 만남, 정말 기대되지 않나요? 자, 그럼 시작해볼까요!

프로젝트 구조 설계: 왜 두 개의 어플리케이션인가?

프로젝트를 시작하기 전에, 왜 하나의 큰 어플리케이션 대신 두 개의 작은 어플리케이션으로 나누는 것이 좋을까요? 여기에는 몇 가지 중요한 이유가 있습니다.

  1. 모듈화 및 유지보수성 향상:
    • 프로젝트를 여러 개의 작은 모듈로 나누면 각 모듈은 독립적으로 개발, 테스트 및 배포할 수 있습니다. 이는 전체 시스템의 복잡성을 줄이고 유지보수성을 향상시키는 데 도움이 됩니다. 예를 들어, 'a' 어플리케이션은 사용자 인증 및 관리 기능을, 'b' 어플리케이션은 핵심 비즈니스 로직을 담당하도록 분리할 수 있습니다. 이렇게 하면 각 어플리케이션은 특정 기능에 집중할 수 있으며, 코드 변경이 다른 부분에 미치는 영향을 최소화할 수 있습니다.
  2. 독립적인 확장성:
    • 각 어플리케이션은 독립적으로 확장할 수 있습니다. 예를 들어, 'b' 어플리케이션에 트래픽이 몰리면 'b'만 확장하면 됩니다. 'a' 어플리케이션은 그대로 유지하면서도 시스템 전체의 성능을 유지할 수 있습니다. 이는 클라우드 환경에서 매우 중요한 장점입니다. Docker를 사용하면 이러한 확장이 더욱 쉬워집니다. 각 어플리케이션을 독립적인 컨테이너로 배포하고, 필요에 따라 컨테이너 수를 늘리거나 줄일 수 있습니다.
  3. 팀 협업 효율성 증대:
    • 각 어플리케이션을 별도의 팀이 담당할 수 있습니다. 이는 팀 간의 책임과 역할을 명확히 하고, 개발 속도를 높이는 데 기여합니다. 예를 들어, 'a' 어플리케이션은 프론트엔드 팀이, 'b' 어플리케이션은 백엔드 팀이 담당할 수 있습니다. 각 팀은 자신의 영역에 집중하여 개발하고, 필요한 경우에만 서로 협력하면 됩니다.

어플리케이션 생성: Spring Initializr 활용

자, 이제 실제로 두 개의 어플리케이션을 생성해볼까요? Spring InitializrSpring Boot 프로젝트를 쉽게 시작할 수 있도록 도와주는 아주 유용한 도구입니다. 웹 브라우저에서 start.spring.io에 접속하여 다음과 같이 설정하세요.

  1. Project: Maven 또는 Gradle을 선택합니다. (저는 Gradle을 선호합니다!)
  2. Language: Java, Kotlin 또는 Groovy를 선택합니다. (Java가 가장 일반적이죠.)
  3. Spring Boot: 최신 안정 버전을 선택합니다.
  4. Group: 프로젝트의 그룹 ID를 입력합니다. (예: com.example)
  5. Artifact: 어플리케이션 이름을 입력합니다. (예: application-a)
  6. Dependencies: 필요한 의존성을 추가합니다. (예: Spring Web, Spring Data JPA 등)

위와 같이 설정한 후 'Generate' 버튼을 클릭하면 프로젝트 템플릿이 다운로드됩니다. 이 과정을 반복하여 'application-b' 프로젝트도 생성하세요. 이제 여러분은 두 개의 Spring Boot 프로젝트를 가지게 되었습니다!

어플리케이션 A와 B 설정 및 코딩

이제 각 어플리케이션의 설정을 변경하고 코드를 작성해볼까요? 먼저 'application-a' 프로젝트부터 시작해봅시다.

application-a: 사용자 인증 및 관리

'application-a'는 사용자 인증 및 관리 기능을 담당합니다. 사용자는 이 어플리케이션을 통해 회원 가입, 로그인, 정보 수정 등을 할 수 있습니다. 이를 위해 다음과 같은 단계를 따르세요.

  1. 데이터베이스 설정: 데이터베이스 연결 정보를 application.properties 또는 application.yml 파일에 설정합니다. 예를 들어, MySQL을 사용하는 경우 다음과 같이 설정할 수 있습니다.

    spring.datasource.url=jdbc:mysql://localhost:3306/mydb
    spring.datasource.username=root
    spring.datasource.password=password
    spring.jpa.hibernate.ddl-auto=update
    
  2. Entity 클래스 생성: 사용자 정보를 저장할 User Entity 클래스를 생성합니다. 이 클래스는 데이터베이스 테이블과 매핑됩니다.

    @Entity
    @Table(name = "users")
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String username;
        private String password;
        // ... getters and setters
    }
    
  3. Repository 인터페이스 생성: 데이터베이스에 접근하기 위한 UserRepository 인터페이스를 생성합니다. Spring Data JPA를 사용하면 간단하게 CRUD (Create, Read, Update, Delete) 기능을 구현할 수 있습니다.

    public interface UserRepository extends JpaRepository<User, Long> {
        Optional<User> findByUsername(String username);
    }
    
  4. Service 클래스 생성: 사용자 인증 및 관리 로직을 구현하는 UserService 클래스를 생성합니다. 이 클래스는 UserRepository를 사용하여 데이터베이스에 접근하고, 사용자 정보를 처리합니다.

    @Service
    public class UserService {
        @Autowired
        private UserRepository userRepository;
    
        public User registerUser(String username, String password) {
            // ... 사용자 등록 로직
        }
    
        public User authenticateUser(String username, String password) {
            // ... 사용자 인증 로직
        }
    }
    
  5. Controller 클래스 생성: API 엔드포인트를 처리하는 UserController 클래스를 생성합니다. 이 클래스는 UserService를 사용하여 사용자 인증 및 관리 기능을 제공합니다.

    @RestController
    @RequestMapping("/users")
    public class UserController {
        @Autowired
        private UserService userService;
    
        @PostMapping("/register")
        public User registerUser(@RequestParam String username, @RequestParam String password) {
            return userService.registerUser(username, password);
        }
    
        @PostMapping("/login")
        public User loginUser(@RequestParam String username, @RequestParam String password) {
            return userService.authenticateUser(username, password);
        }
    }
    

application-b: 핵심 비즈니스 로직

'application-b'는 핵심 비즈니스 로직을 담당합니다. 예를 들어, 이 어플리케이션은 상품 관리, 주문 처리, 결제 등의 기능을 제공할 수 있습니다. 'application-a'와 마찬가지로 다음과 같은 단계를 따르세요.

  1. 데이터베이스 설정: 'application-a'와 동일한 방법으로 데이터베이스 연결 정보를 설정합니다.
  2. Entity 클래스 생성: 상품, 주문, 결제 등 필요한 Entity 클래스를 생성합니다.
  3. Repository 인터페이스 생성: 데이터베이스에 접근하기 위한 Repository 인터페이스를 생성합니다.
  4. Service 클래스 생성: 비즈니스 로직을 구현하는 Service 클래스를 생성합니다.
  5. Controller 클래스 생성: API 엔드포인트를 처리하는 Controller 클래스를 생성합니다.

Docker를 사용한 배포

이제 두 개의 어플리케이션을 Docker를 사용하여 배포해볼까요? Docker는 어플리케이션을 컨테이너라는 격리된 환경에서 실행할 수 있도록 해주는 도구입니다. Docker를 사용하면 어플리케이션을 쉽게 배포하고 관리할 수 있습니다.

Dockerfile 작성

각 어플리케이션의 루트 디렉토리에 Dockerfile을 생성합니다. DockerfileDocker 이미지를 빌드하기 위한 명령어들을 담고 있는 텍스트 파일입니다.

application-a의 Dockerfile 예시:

FROM openjdk:17-jdk-slim
VOLUME /tmp
COPY build/libs/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

application-b의 Dockerfile 예시:

FROM openjdk:17-jdk-slim
VOLUME /tmp
COPY build/libs/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

Docker 이미지 빌드

각 어플리케이션의 루트 디렉토리에서 다음 명령어를 실행하여 Docker 이미지를 빌드합니다.

docker build -t application-a .
docker build -t application-b .

Docker 컨테이너 실행

Docker 이미지를 사용하여 컨테이너를 실행합니다.

docker run -d -p 8080:8080 application-a
docker run -d -p 8081:8080 application-b

이제 여러분의 Spring Boot 어플리케이션은 Docker 컨테이너에서 실행되고 있습니다! localhost:8080localhost:8081에 접속하여 각 어플리케이션에 접근할 수 있습니다.

결론

오늘은 Spring Boot 프로젝트를 두 개의 어플리케이션으로 나누어 관리하고, Docker를 사용하여 배포하는 방법에 대해 알아보았습니다. 이러한 방법은 프로젝트의 모듈화, 유지보수성, 확장성 및 팀 협업 효율성을 향상시키는 데 도움이 됩니다. Spring BootDocker를 함께 사용하면 더욱 강력하고 유연한 어플리케이션을 개발할 수 있습니다. 여러분도 한번 시도해보세요!

질문이나 의견 있으시면 언제든지 댓글로 남겨주세요! Happy coding! 😊