[인프런 BE 0기] 미니 프로젝트 1단계

HeeYeon Kim·2024년 3월 1일
0

STUDY

목록 보기
14/15
post-thumbnail

인프런 워밍업 클럽 스터디 0기
BE 2주차 마무리



1단계 개발

  • 팀 등록 기능
  • 팀 조회 기능
  • 직원 등록 기능
  • 직원 조회 기능

데이터베이스

직원



Controller

package com.example.company.controller;

import com.example.company.dto.MemberResponse;
import com.example.company.dto.TeamResponse;
import com.example.company.dto.createTeamRequest;
import com.example.company.dto.createMemberRequest;
import com.example.company.service.CompanyService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class CompanyController {

    private CompanyService companyService;
    public CompanyController(CompanyService companyService) {
        this.companyService = companyService;
    }

    @PostMapping("api/team")
    public void saveTeam(@RequestBody createTeamRequest request){
        companyService.saveTeam(request);
    }

    @PostMapping("api/member")
    public void saveMember(@RequestBody createMemberRequest request){
        companyService.saveMember(request);
    }

    @GetMapping("api/team")
    public List<TeamResponse> getTeams(){
        return companyService.getTeams();
    }

    @GetMapping("api/member")
    public List<MemberResponse> getMembers(){
        return companyService.getMembers();
    }

}

팀 등록 기능


Team(domain)

package com.example.company.domain;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor
public class Team {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    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++;
    }
}
  • primary key : @GeneratedValue를 이용해 id 생성
  • managerName : 팀 생성 시엔 null
    • setTeamManager() : Member 생성 후 Manager가 생기면 데이터 수정
  • memberCount : 팀 멤버
    • setMemberCount() : Member 생성되면서 팀이 등록되면 member 수 1씩 증가

createTeamRequest(DTO)

package com.example.company.dto;

import lombok.Getter;

@Getter
public class createTeamRequest {
    private String name;
}
  • 기본 생성자를 이용하여 객체를 생성하나 라이브러리가 추가되어 있는 상태이므로 없어도 됨
  • @Getter을 이용하여 getName()이 현재 있는 상태. 값을 바인딩함

TeamRepository(Repository)

package com.example.company.repository;

import com.example.company.domain.Team;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public interface TeamRepository extends JpaRepository<Team,Long> {
    Optional<Team> findByName(String name);
}
  • JpaRepository를 상속받아 생성
  • findByName() : 이름을 통해 팀을 찾기 위한 메소드

CompanyService(Service)

@Transactional
public void saveTeam(createTeamRequest request){
      teamRepository.save(new Team(request.getName()));
}
  • createTeamRequest를 통해 읽은 이름을 이용하여 team 생성


팀 조회 기능


TeamResponse(DTO)

package com.example.company.dto;

import com.example.company.domain.Team;
import lombok.Getter;

@Getter
public class TeamResponse {
    private String name;
    private String manager;
    private long memberCount;

    public TeamResponse(Team team) {
        this.name = team.getName();
        this.manager = team.getManagerName();
        this.memberCount = team.getMemberCount();
    }
}

  • 조회한 team 정보 중 응답할 데이터만 걸러내어 TeamResponse 객체를 생성 후 @Getter 통해 JSON 반환

CompanyService(Service)

public List<TeamResponse> getTeams(){
        List<Team> teams = teamRepository.findAll();
        return teams.stream()
                .map(TeamResponse::new)
                .collect(Collectors.toList());
}
  • findAll() 을 이용하여 모든 team의 정보를 읽은 뒤 stream()을 이용해 리스트를 생성하여 반환


직원 등록 기능


Member(domain)

package com.example.company.domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDate;

@Entity
@Getter
@NoArgsConstructor
public class Member {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String name;
    private long teamId;
    @Enumerated(EnumType.STRING)
    private Role role;
    private LocalDate birthday;
    private LocalDate workStartDate;

    public Member(String name, long teamId, Role role, 
    			  LocalDate birthday, LocalDate workStartDate) {
        this.name = name;
        this.teamId = teamId;
        this.role = role;
        this.birthday = birthday;
        this.workStartDate = workStartDate;
    }
}
  • primary key : @GeneratedValue를 이용해 id 생성
  • teamId : Member 생성 시엔 팀 이름이 입력됨. Service 클래스에서 이름을 이용해 id를 찾은 뒤 저장하도록 함
  • Role : Role은 enumType으로 EnumType.String으로 설정했기 때문에 Member, Manager 둘 중 하나가 String 형태로 저장됨

Role(Enum Type)

package com.example.company.domain;

public enum Role {
    Manager,
    Member;
}

createMemberRequest(DTO)

package com.example.company.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;

import java.time.LocalDate;

@Getter
public class createMemberRequest {
    private String name;
    private String teamName;
    @JsonProperty("isManager")
    private boolean isManager;
    private LocalDate workStartDate;
    private LocalDate birthday;
}
  • MySQL에서 JSON에서 boolean 타입을 읽어올 때 인식하지 못해서 기본값 false만 들어가는 오류 발생
  • 그래서 @JsonProperty를 이용해 설정

MemberRepository(Repository)

package com.example.company.repository;

import com.example.company.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberRepository extends JpaRepository<Member,Long> {
}
  • JpaRepository를 상속받아 생성

CompanyService(Service)

@Transactional
    public void saveMember(createMemberRequest request){

        Team team = teamRepository.findByName(request.getTeamName())
                .orElseThrow(IllegalArgumentException::new);

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

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

        if(role.equals(Role.Manager)){
            team.setTeamManager(request.getName());
            teamRepository.save(team);
        }
        team.setMemberCount();
        teamRepository.save(team);
    }
  • createMemberRequest를 통해 받아온 데이터를 이용하여 member 생성
  • teamName을 이용해 teamId를 찾아야하기 때문에 teamRepository의 findByName() 메소드를 이용하여 team을 찾음
  • 만약 isManager가 true일 경우 Manager이므로 Manager 저장. 아니면 Member 저장
  • memberRepository를 이용해 member 저장
  • 만약 role이 manager라면 각 team의 teamManager 정보도 수정해야하기 때문에 team의 setTeamManager() 메소드를 이용해 수정 후 team 저장
    • save는 저장 외에 값이 업데이트 된 경우에도 적용됨
  • team의 인원수도 수정해야하기 때문에 setMemberCount() 메소드를 이용하여 증가



직원 조회 기능


MemberResponse(DTO)

package com.example.company.dto;

import com.example.company.domain.Role;
import jakarta.persistence.Enumerated;
import lombok.Getter;

import java.time.LocalDate;

@Getter
public class MemberResponse {
    private String name;
    private String teamName;
    private Role role;
    private LocalDate birthday;
    private LocalDate workStartDate;

    public MemberResponse(String name, String teamName, 
    					Role role, LocalDate birthday, LocalDate workStartDate) {
        this.name = name;
        this.teamName = teamName;
        this.role = role;
        this.birthday = birthday;
        this.workStartDate = workStartDate;
    }
}


  • 응답할 데이터만 걸러내어 MemberResponse객체를 생성한 뒤 JSON으로 변환

CompanyService(Service)

public List<MemberResponse> getMembers(){
        List<Member> members = memberRepository.findAll();
        List<MemberResponse> memberResponses = new ArrayList<>();
        for(Member m : members){
            String teamName = teamRepository.findById(m.getTeamId()).orElseThrow().getName();
            memberResponses.add(new MemberResponse(m.getName(),teamName,m.getRole()
            					,m.getBirthday(),m.getWorkStartDate()));
        }
        return memberResponses;
    }
  • findAll() 메소드를 이용하여 모든 멤버 조회
  • 응답할 데이터 형태를 만들기 위한 MemberResponse 타입 memberResponses 리스트 선언
  • teamRepository의 findById() 메소드를 이용하여 팀의 이름을 찾음
  • 리스트에 MemberResponse 생성자를 이용하여 객체를 생성한 뒤 저장


수정 계획

  • 현재 조회 과정에서 teamName을 찾는 과정이 너무 복잡함. 이 부분 수정 예정




강의

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지!

0개의 댓글