프로젝트 2일차 멀티 모듈 설정과 프로젝트 구조 고민

이상민·2024년 10월 22일
0

1. 프로젝트 구조

  • 이번 프로젝트는 API, Batch, Streaming 3개의 서버로 구성되어 있다. 각 서버는 독립적으로 배포되어야 한다.

  • API 모듈에는 User 엔티티와 같은 공용 엔티티가 포함되어 있고
    중복되는 Util(JWT, JDBC Config) 및 DTO(UserRequestDto) 객체들을 하나의 모듈로 통합하여 관리하려고 한다.

  • 다른 모듈들은 해당 기능에만 집중하여 개발을 진행할 수 있다.
    2. 멀티 모듈 도입 이유

  • 중복 객체들을 코어 모듈에 몰아넣고, 이를 기반으로 빌드와 배포를 자동화할 수 있다.

  • 새로운 요구사항으로 기존 서비스를 수정하고 배포할 때, 다른 서버까지 재배포가 필요할 수 있다.

  • 한 서버가 장애가 발생하면, 다른 서버도 영향을 받을 가능성이 높다.

  • 멀티 모듈을 사용하면 이러한 문제들을 해결할 수 있을 것으로 기대된다.

3. 문제 발생

  • 멀티 모듈 설정 중 마지막 테스트에서 Bean 출력이 되지 않는 문제가 발생했다.

  • 해결책으로 하나의 레포지토리 안에 3개의 프로젝트 패키지를 나눠 진행하기로 했다.

4. Git 문제

  • Git clone 시, 3개의 프로젝트 패키지가 제대로 표시되지 않는 문제가 발생했다.

  • 이를 해결하기 위해 IntelliJ 프로젝트 구조에서 직접 모듈 추가를 시도했다.

  • 그러나 이 방법을 사용했을 때, 커밋 내역에 겹치는 파일들이 대량으로 추가되고 삭제되는 문제가 생겼다.

5. 고민과 해결 방안

  • 다시 멀티 모듈을 사용해서 프로젝트를 진행할지 고민 중이다.

  • 또는, 레포지토리를 3개로 분리해서 각 서버를 독립적으로 관리하는 방법도 고려하고 있다.

  • 우선, 기능 구현부터 진행하기로 결정하여 하나의 프로젝트 패키지를 클론해 그 안에서 기능 구현을 시작했다.

참고 내용: https://velog.io/@jthugg/spring-multi-module

회원 가입 시 지갑이 자동으로 생성

  • 초기에 유저의 지갑의 정보를 조회하는 api만 구현

  • 하지만 우리 서비스를 유저가 이용 시에 지갑은 필수로 있어야 하기 때문에

  • 따로 지갑을 생성하는 api를 구성하기 보다 유저가 회원가입 시 수량이 o개인

  • 지갑이 자동으로 생성되도록 구성하기로 결정

    @Transactional
    public void createWallet(User user) {
        List<Crypto> cryptos = cryptoRepository.findAll();  // 데이터베이스에서 모든 코인을 조회

        // 각 코인에 대한 지갑 생성
        for (Crypto crypto : cryptos) {
            Wallet wallet = new Wallet(user, 0L, crypto.getSymbol());
            walletRepository.save(wallet);
        }
    }

해당 지갑 생성 메서드를 따로 구현 후

지갑 서비스를 주입받아 회원가입시에 사용
walletService.createWallet(savedUser);


@Transactional
    public SignupResponse signup(SignupRequest request) {
        validateEmail(request.getEmail());

        UserService.validateNewPassword(request.getPassword());
        String encodedPassword = passwordEncoder.encode(request.getPassword());
        User newUser = User.of(request.getEmail(), encodedPassword, request.getName());

        User savedUser = userRepository.save(newUser);
        walletService.createWallet(savedUser);
        String token = jwtUtil.createToken(savedUser.getId(), savedUser.getEmail());

        jwtUtil.addJwtToCookie(token);
        return SignupResponse.of(token);
    }

내일 할 것

1. 핵심 기능 구현

  • 지갑 안에 나를 구독한 사람의 돈을 저장해야해

  • 그리고 그 사람의 돈을 저장하는 생명 주기는 1개월

  • 주는 돈이 10%가 올라가면 팔도록 or 내가 팔면 알아서 팔리도록

2. 멀티 모듈 확정 짓기

profile
안녕하세요

0개의 댓글