[인프런 워밍업 클럽 스터디1기] BE 3주차 회고록
강의 수강10일차 - 객체지향과 JPA연관관계JPA를 사용하는 이유를 배우는 단계, 무려 연관관계와 지연로딩에 관한 내용이다.자바와 같이 JPA를 객체지향적으로 설계하기 위해 연관관계 매핑을 사용한다.처음에 N:1 과, 1:1, N:M,의 경우에 대해 배우게 된다. 더불어 참조 관계를 단방향, 양방향으로 보게되고 연관관계의 주인이라는 개념을 이해하기엔 복잡한 부분도 있었다.N:M은 문제가 N+1이라는 toString의 순환참조로 인해 재귀함수가 되는데 이 경우에는 N:M을 N:1, 1:1, 1:M으로 테이블 하나를 중간다리 처럼 생성하여 나누는 것이 좋은 것으로 알고 있다.그리고 트랜잭션을 사용하고 있을 때, 한 쪽만 연결 해두면 반대 쪽은 알 수 없기에 각각의 setter를 연결해주는 방법을 이용하여 서로 알 수 있게 해주는 방법에 대해서 알게 되었다.또한 Fetch 옵션이 최적화에 밀접한 영향이 있고, 항상 연관관계를 사용하는 것이 좋은 것만은 아니기에 장단점을 잘 따져보고 사용하는 것이 좋겠다!11일차 - 기본적인 배포를 위한 준비Github와 AWS를 이용하여 우리가 만든 라이브러리 앱을 직접 외부에서 사용해볼 수 있게 하는 단계이다.프로파일을 적용시켜둬서 우리가 개발단계와 배포단계에서 사용하는 설정들을 미리 해둘 수 있다.AWS은 우리가 흔하게 접하게될 사이트다 유료 사이트이지만, 프리티어 내에서는 1년동안 자유롭게 사용가능하고 특별하게 사고를 치지 않는 이상은 별도의 요금은 발생하지 않을 것이다.12일차 - AWS와 EC2 배포본격적으로 AWS와 EC2를 사용해보는 시간이다.EC2는 리눅스를 사용하는데 개발자 분들이 알아야하는 것 중 리눅스 명령어들을 직접 사용해보는 시간이었다. 근데 뭔가 사용하는 명령어들이 ls, cd, pwd, cd, rmdir... 맥에 있는 터미널과 비슷하다는 느낌을 받는다...? 이 부분은 나중에 리눅스 운영체제 사용해보면서 경험해봐야겠다.Github에 올려둔 코드들을 어떻게 EC2에 올리는지 궁금했었는데 git clone을 이용하여 저장소 주소에 있는 파일들을 받아오는 방법이었다. 리눅스 swap 하는 방법을 통해서 메모리가 부족할 때 디스크 자체에서 대신하는 방법들을 배웠다 우리에게는 메모리 스왑 방식이 좀 더 익숙하긴 한데 비슷한 방식인 것 같다.빌드를 하고 방화벽 설정을 하고 그리고 실행중인 서버를 중단하고, EC2 콘솔을 닫아도 백그라운드에서 작동하는 방법네이버나 구글처럼, 아이피를 치고 들어가는 것이 아닌 도메인을 이용하여 DNS을 적용하는 방법 13일차 - Spring Boot 설정, 버전업 이해하기우리가 사용하는 스프링과 스프링부트에 관하여 좀 더 알아보는 시간 스프링이 어떻게 현재까지 이어져왔고 스프링부트로 인해 스프링을 좀 더 쉽게 쓰게 되었다.추가로 Lombok의 사용법도 배우면서 보일로 플레이트 코드를 줄이고 좀 더 깔끔하게 쓰는 방법에 대해서 배우게 되었다.미션 - 미니프로젝트 1차 모든 것이 처음부터 시작하는 상황으로 돌아가는 상황이다.먼저 테이블과 객체 설계부터 들어갔다.롬복을 사용해서 좀 더 깔끔하게 코드를 만들 수 있었다. public class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long teamId; private String teamName; @OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<>();public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long memberId; private String memberName; private boolean isManager; private LocalDate hireDate; private LocalDate brithDay; @ManyToOne @JoinColumn(name = "team_id") private Team team; 팀 등록기능과 직원 등록기능은 꽤 간단한 편이지만팀 전체적으로 조회 기능과, 직원 전체 기능을 조회하는 것이 꽤 난이도가 있었다.서로 하나만 쓰는 것도 아니고 동시에 같이 쓰기에 이것을 어떻게 처리할 것인가가 관건이었고둘 다 Response를 리스트로 보내기 위해서 객체들을 가져와서 새로 객체들을 만들어 리스트로 묶어줬다.다행인건 과제에서도 비슷한 과제가 존재하였기에 그나마 만들 수 있었던 것 같았다.@Transactional public List<GetAllMembersResponse> getAllMembers() { List<Member> members = memberRepository.findAll(); return members.stream() .map(this::mapToGetAllMembersResponse) .collect(Collectors.toList()); } private GetAllMembersResponse mapToGetAllMembersResponse(Member member) { GetAllMembersResponse response = new GetAllMembersResponse(); response.setName(member.getMemberName()); response.setTeamName(member.getTeam().getTeamName()); response.setRole(member.isManager() ? "MANAGER" : "MEMBER"); response.setBirthDay(member.getBirthDay()); response.setWorkStartDate(member.getHireDate()); return response; }순식간에 많은 내용을 배우면서 이 내용을 어떻게 써야할지 갈피를 못 잡는 것 보다단계적으로 상위 과제를 주면서 미니프로젝트를 완성해가는 것이 뭔가 뿌듯하다.아직 4단계 까지 남아있으니까 2단계 3단계 점차 나아가면서 마지막 배포 단계까지 열심히 작성해봐야겠다!