Wordle Maker Project Spring 4일차

PROLCY·2023년 1월 28일
0

오늘은 1월 28일 4일차이다.

목표

  • ModelMapper 적용
  • Service 일부 구성
  • Controller 일부 구성

진행

먼저 ModelMapper 관련해서, 내가 원하는 것은 SolverDTO의 makerNickname을 Solver 엔티티의 maker에 대응시키는 것이다. 어제는 대응이 되지 않고 매핑하고 나면 null로 처리가 되었는데, 오늘 찾아보니 내가 MatchingStrategies를 STRICT로 지정해놔서 그런 것이었다. 기본값인 STANDARD로 지정하면 잘 매핑되었다.

다음으로, Controller의 일부를 구성하면서, Service도 같이 제작해보았다.

package prolcy.wordle_maker_spring.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.web.bind.annotation.*;
import prolcy.wordle_maker_spring.dto.MakerDTO;
import prolcy.wordle_maker_spring.mongodb.model.WordDoc;
import prolcy.wordle_maker_spring.mongodb.service.WordService;
import prolcy.wordle_maker_spring.service.MakerService;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/make")
@RequiredArgsConstructor
@Log4j2
public class MakerController {

    private final WordService wordService;
    private final MakerService makerService;
    
    @PostMapping("/duplicated")
    public String duplicatedNickname(@RequestBody MakerDTO makerDTO) {
        log.info(makerDTO);
        return makerService.isDuplicatedNickname(makerDTO) ? "duplicated" : "not-duplicated";
    }
    
    @PostMapping("/exist")
    public Map<String, Boolean> isExistWord(@RequestBody WordDoc wordDoc) {
        log.info(wordDoc);
        Map<String, Boolean> response = new HashMap<>();
        if(wordService.isExistWord(wordDoc.getWord()))
            response.put("exist", true);
        else
            response.put("exist", false);
        return response;
    }
    
    @PostMapping("/register")
    public String register(@RequestBody MakerDTO makerDTO) {
        String url = "testUrl"; // url 생성 추가 필요
        makerDTO.setUrl(url);
        String nickname = makerService.register(makerDTO);

        //세션 등록 추가

        log.info("------" + nickname + " is registered----");
        return url;
    }
}

MakerController이고, /maker로 시작하는 URL에 대해서 처리하는 컨트롤러이다. 3개의 메소드가 존재하는데, 위에서부터 닉네임 중복 확인, 단어가 존재하는 단어인지 확인, maker 등록이다.

package prolcy.wordle_maker_spring.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.modelmapper.ModelMapper;
import org.springframework.stereotype.Service;
import prolcy.wordle_maker_spring.domain.Maker;
import prolcy.wordle_maker_spring.dto.MakerDTO;
import prolcy.wordle_maker_spring.repository.MakerRepository;

@Service
@RequiredArgsConstructor
@Log4j2
public class MakerServiceImpl implements MakerService{

    private final MakerRepository makerRepository;
    private final ModelMapper modelMapper;
    
    @Override
    public boolean isDuplicatedNickname(MakerDTO makerDTO) {
        Maker maker = makerRepository.findByNickname(makerDTO.getNickname());
        return maker != null;
    }
    
    @Override
    public String register(MakerDTO makerDTO) {
        Maker maker = modelMapper.map(makerDTO, Maker.class);
        Maker result = makerRepository.save(maker);
        return result.getNickname();
    }
    
    @Override
    public String getCorrectWord(String nickname) {
        return makerRepository.findByNickname(nickname).getCorrectWord();
    }
}

MakerServiceImpl이다. 위에서부터 차례대로 중복된 단어 판별, 등록, 정답단어 가져오기이다.

package prolcy.wordle_maker_spring.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.web.bind.annotation.*;
import prolcy.wordle_maker_spring.dto.SolverDTO;
import prolcy.wordle_maker_spring.mongodb.model.WordDoc;
import prolcy.wordle_maker_spring.mongodb.service.WordService;
import prolcy.wordle_maker_spring.service.MakerService;
import prolcy.wordle_maker_spring.service.SolverService;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/solve")
@RequiredArgsConstructor
@Log4j2
public class SolverController {

    public final MakerService makerService;
    public final SolverService solverService;
    public final WordService wordService;
    
    @PostMapping("/{makerNickname}/duplicated")
    public String duplicatedNickname(@RequestBody SolverDTO solverDTO, @PathVariable String makerNickname) {
        solverDTO.setMakerNickname(makerNickname);
        log.info(solverDTO);
        return solverService.isDuplicatedNickname(solverDTO) ? "duplicated" : "not-duplicated";
    }
    
    @PostMapping("/exist")
    public Map<String, Boolean> isExistWord(@RequestBody WordDoc wordDoc) {
        log.info(wordDoc);
        Map<String, Boolean> response = new HashMap<>();
        if(wordService.isExistWord(wordDoc.getWord()))
            response.put("exist", true);
        else
            response.put("exist", false);
        return response;
    }
    
    @PostMapping("/{makerNickname}/register")
    public Map<String, String> register(@RequestBody SolverDTO solverDTO, @PathVariable String makerNickname) {
        String correctWord = makerService.getCorrectWord(makerNickname);
        solverDTO.setMakerNickname(makerNickname);
        String nickname = solverService.register(solverDTO);
        log.info("------SOLVER " + nickname + " is registered----");
        //세션 등록
        //웹소켓 등록
        Map<String, String> response = new HashMap<>();
        response.put("wordCorrect", correctWord);
        return response;
    }
}

SolverController이다. 위에서부터 닉네임 중복 확인, 단어가 존재하는 단어인지 확인, solver 등록이다.

package prolcy.wordle_maker_spring.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.modelmapper.ModelMapper;
import org.springframework.stereotype.Service;
import prolcy.wordle_maker_spring.domain.Maker;
import prolcy.wordle_maker_spring.domain.Solver;
import prolcy.wordle_maker_spring.dto.SolverDTO;
import prolcy.wordle_maker_spring.repository.SolverRepository;

@Service
@RequiredArgsConstructor
@Log4j2
public class SolverServiceImpl implements SolverService{

    private final SolverRepository solverRepository;
    private final ModelMapper modelMapper;
    
    @Override
    public boolean isDuplicatedNickname(SolverDTO solverDTO) {
        Maker maker = Maker.builder()
                .nickname(solverDTO.getMakerNickname())
                .build();
        Solver solver = solverRepository.findByNicknameAndMaker(solverDTO.getNickname(), maker);
        return solver != null;
    }
    
    @Override
    public String register(SolverDTO solverDTO) {
        Solver solver = modelMapper.map(solverDTO, Solver.class);
        Solver result = solverRepository.save(solver);
        return result.getNickname();
    }
}

SolverServiceImpl이다. 위에서부터 닉네임 중복 확인, solver 등록 역할을 한다.

package prolcy.wordle_maker_spring.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import prolcy.wordle_maker_spring.dto.MakerDTO;
import prolcy.wordle_maker_spring.service.MakerService;

@RestController
@RequestMapping("/load")
@RequiredArgsConstructor
@Log4j2
public class LoadController {

    private final MakerService makerService;
    
    @PostMapping("/exist")
    public Boolean isExistNickname(@RequestBody MakerDTO makerDTO) {
        log.info(makerDTO);
        return makerService.isDuplicatedNickname(makerDTO);
    }
}

LoadController이다. 안의 메소드는 처음 입장 시 닉네임을 확인하여 존재하는 닉네임인지 판별하는 역할을 하는 메소드다.

내일 할 것

  • Service 구성(2)
  • Controller 구성(2)
  • 세션 추가

마무리

처음으로 컨트롤러를 구성해봤는데, 확실히 nodejs에서 라우터 구성하는 것과는 많이 다르다. dto, service, repository, entity 등 신경쓸 게 너무 많아서 일일이 각 부분에 대한 테스트 코드를 작성하고 결과를 확인하느라 시간이 좀 걸렸다. 그래도 14개의 라우터 중에 7개를 이번에 만들어서 예상보다 빨리 프로젝트를 마무리할 수 있을지도 모르겠다.

0개의 댓글