[인프런 워밍업 클럽 0기] BE 미니 프로젝트 1단계

[인프런 워밍업 클럽 0기] BE 미니 프로젝트 1단계

image

Team 기능

Controller

@RestController
public class TeamController {

    private final TeamService teamService;

    public TeamController(TeamService teamService) {
        this.teamService = teamService;
    }

    @PostMapping("/team")
    public void saveTeam(@RequestBody TeamCreateRequest request) {
        teamService.saveTeam(request);
    }

    @GetMapping("/team")
    public List<TeamFindResponse> getTeam() {
        return teamService.getTeams();
    }

}

Domain

@Entity
public class Team {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(nullable = false, length = 25)
    private String name;
    private String managerName;
    private long memberCount;

    public Team(String name) {
        this.name = name;
    }

    public void setTeamManager(String name){
        this.managerName = name;
    }

    public void setMemberCount(){
        this.memberCount++;
    }

    public String getName() {
        return name;
    }

    public String getManagerName() {
        return managerName;
    }

    public long getMemberCount() {
        return memberCount;
    }

    public long getId() {
        return id;
    }
}

Service

@Service
public class TeamService {

    private final TeamRepository teamRepository;

    public TeamService(TeamRepository teamRepository) {
        this.teamRepository = teamRepository;
    }

    @Transactional
    public void saveTeam(TeamCreateRequest request){
        teamRepository.save(new Team(request.getName()));
    }

    public List<TeamFindResponse> getTeams(){
        List<Team> teams = teamRepository.findAll();
        return teams.stream()
                .map(TeamFindResponse::new)
                .collect(Collectors.toList());
    }
}

Member 기능

Controller

@RestController
public class MemberController {
    private final MemberService memberService;

    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

    @PostMapping("/member")
    public void saveMember(@RequestBody MemberCreateRequest request) {
        memberService.saveMember(request);
    }

    @GetMapping("/member")
    public List<MemberFindResponse> getMember() {
        return memberService.getMember();
    }
}

Domain

@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 25)
    private String name;
    private Long teamId;
    @Enumerated(EnumType.STRING)
    private Role role;
    private LocalDate birthday;
    private LocalDate workStartDate;

    public Member(Long id, String name, Long teamId, Role role, LocalDate birthday, LocalDate workStartDate) {
        this.id = id;
        this.name = name;
        this.teamId = teamId;
        this.role = role;
        this.birthday = birthday;
        this.workStartDate = workStartDate;
    }

    //getters
}
public enum Role {
    Manager,
    Member;
}

Service

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    @Transactional
    public void saveMember(MemberCreateRequest request){

        Member member = memberRepository.findByName(request.getTeamName())
                .orElseThrow(IllegalArgumentException::new);

        Role role = request.isManager() ? Role.Manager : Role.Member;

        memberRepository.save(
                new Member(
                        request.getName(),request.getTeamId(), role, request.getBirthday(), request.getWorkStartDate()
                )
        );

        if(role.equals(Role.Manager)){
            team.setTeamManager(request.getName());
            memberRepository.save(team);
        }
        team.setMemberCount();
        memberRepository.save(team);
    }

    public void getMember() {
        List<MemberFindResponse> response = new ArrayList<>();

        List<Member> members = memberRepository.findAll();
        for (Member member : members) {
            response.add(
                    new MemberFindResponse(
                            member.getName(),
                            member.getTeamId(),
                            member.getRole(),
                            member.getBirthday(),
                            member.getWorkStartDate()
                    )
            );
        }

        return response;
    }
}

 

후기

아무래도 기초가 없이 진행하려다 보니 여러가지가 맞물려서 오류가 일어날 때

어떻게 개선해야할지 길을 잃는 경우가 많은 것 같다.

기능별로 구분하기 위해 Team과 Member를 나누어

각각 기능 구현은 가능하지만

테이블을 참조할 경우 어떻게 객체 사이를 오가게 구현해야하지?

같은 조금의 응용할 거리가 나와도 구현이 불가능해진다...

테이블을 중복해서 생성하는 건 당연히 맞는 방향이 아닌데

그럼 member에서 team을 불러오는 게 맞는 건가? 하려면 할 순 있는데 아닌 것 같은데?

같은... 데서 구현에 병목들이 생기다보니 확장불가능한 구현만 가능하고

2~4단계로는 나아가지 못했다 ㅠㅠ

(다른 분들의 깃헙을 참고해도 잘 적용이 안 되는 무지한 나...)

댓글을 작성해보세요.