[인프런 워밍업 클럽 0기] BE 미니 프로젝트 1단계
1달 전
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단계로는 나아가지 못했다 ㅠㅠ
(다른 분들의 깃헙을 참고해도 잘 적용이 안 되는 무지한 나...)
댓글을 작성해보세요.