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개로 분리해서 각 서버를 독립적으로 관리하는 방법도 고려하고 있다.
우선, 기능 구현부터 진행하기로 결정하여 하나의 프로젝트 패키지를 클론해 그 안에서 기능 구현을 시작했다.
초기에 유저의 지갑의 정보를 조회하는 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. 멀티 모듈 확정 짓기