이번 3주차에서는 JPA 연관관계 매핑하기 강의에서 만들었던 도서관리 프로그램 배포하기를 하였다.
JPA를 조금 더 객체지향적으로 코드를 고쳐볼 수 있었다.
[3주차 과제]
3주차에서 진행한 미니프로젝트는 출퇴근 사내 관리프로그램이었다.
JPA에 대한 개념이 많이 부족해 생각한 대로 프로그램은 돌아가는데 제대로 코드를 작성한게 맞는지, 코드는 깔끔하게 짰는지 등등 많은 생각이 들었다. 그래도 이번 강의를 통해서 JPA가 무엇인지 어떻게 사용하는지 그리고 스프링에 대한 개념에 대해 조금 더 와닿게 되었다.
오래된 취준 기간으로 약간의 강제성이 필요할 때 우연히 인프런 워밍업 클럽 스터디를 접하게 되었고, 현재 나에게 제일 필요했던 공부인 JPA를 공부할 수 있어 정말 뜻 깊은 스터디였다. 단순 강의만 듣는 것이 아닌 미션과 미니프로젝트를 병행하여서 강의 내용을 보다 더 쉽게 이해할 수 있었다.
이번 스터디로 습득한 지식을 바탕으로 조금 더 공부하여 나머지 2,3,4단계까지 마무리 해보고 개인 서버에 배포까지 해볼 예정이다.
@Entity
@Getter
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(nullable = false, length = 20)
private String name;
@Column(nullable = false, length = 20)
private String manager;
@Column(nullable = false)
private long employeeCnt;
protected Team(){}
public Team(String name, String manager, long employeeCnt) {
this.name = name;
this.manager = manager;
this.employeeCnt = employeeCnt;
}
public void updateEmployeeCnt() {
this.employeeCnt++;
}
public void updateManager(String name) {
this.manager = name;
}
}
1
Controller
@RestController
@RequestMapping("/attendance/team")
public class TeamController {
private final TeamService service;
public TeamController(TeamService service) {
this.service = service;
}
@PostMapping("/resister_team")
public void resisterTeam(@RequestBody RegisterTeamRequest request) {
service.insertTeam(request);
}
}
Service
@Service
public class TeamService {
private final TeamRepository repository;
public TeamService(TeamRepository repository) {
this.repository = repository;
}
public void insertTeam(RegisterTeamRequest request) {
repository.findByName(request.getName()).ifPresent(team -> {
throw new IllegalArgumentException("이미 존재하는 팀 이름입니다.");
});
repository.save(new Team(request.getName(),
request.getManager(), request.getMemberCnt()));
}
}
RegisterTeamRequest 객체에서 팀 이름을 꺼내와 등록된 팀이 있는지 확인해준다.
@RestController
@RequestMapping("/attendance/employee")
public class EmployeeController {
private final EmployeeService service;
public EmployeeController(EmployeeService service) {
this.service = service;
}
@PostMapping("/register_employee")
public void resisterEmployee(@RequestBody ResisterEmployeeRequest request) {
service.insertEmployee(request);
}
}
Service
@Service
public class EmployeeService {
private final EmployeeRepository repository;
private final TeamService teamService;
public EmployeeService(EmployeeRepository repository, TeamService teamService) {
this.repository = repository;
this.teamService = teamService;
}
@Transactional
public void insertEmployee(ResisterEmployeeRequest request) {
if (request.getRole() == null) {
throw new IllegalArgumentException("직급을 입력해주세요.");
}
repository.findById(request.getId()).ifPresent(employee -> {
throw new IllegalArgumentException("이미 등록된 직원입니다.");
});
repository.save(new Employee(request.getName(), request.getTeamName(),
request.getRole(), request.getBirthday(), request.getWorkStartDate()));
if (Role.MANAGER.equals(request.getRole())) {
teamService.updateManager(request.getTeamName(), request.getName());
}
teamService.updateEmployeeCnt(request.getTeamName());
}
}
Role이 null인지 확인하고 없다면 예외를 발생시킨다.
Id를 사용하여 이미 등록되어 있는 직원인지 확인한다.
있다면 예외를 발생시키고 없다면 새로운 직원을 만들어준다.
Employee 객체를 만들어 새로운 직원을 저장한다.
이때 Role이 매니저인 경우 teamService의 updateManager메서드를 실행시킨다.
teamService의 updateEmployeeCnt 메서드를 실행하여 해당 팀의 직원 수를 증가시킨다.
TeamService
@Service
public class TeamService {
private final TeamRepository repository;
public TeamService(TeamRepository repository) {
this.repository = repository;
}
@Transactional
public void updateEmployeeCnt(String teamName) {
Team team = findTeamByName(teamName);
team.updateEmployeeCnt();
}
@Transactional
public void updateManager(String teamName, String name) {
Team team = findTeamByName(teamName);
team.updateManager(name);
}
private Team findTeamByName(String name) {
return repository.findByName(name)
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 팀 입니다."));
}
}