[인프런 워밍업 클럽 스터디1기] BE 3주차 회고록

[인프런 워밍업 클럽 스터디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단계 점차 나아가면서 마지막 배포 단계까지 열심히 작성해봐야겠다!

댓글을 작성해보세요.

채널톡 아이콘