🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

[인프런 워밍업 클럽 스터디] BE 1기 세번째 발자국

[인프런 워밍업 클럽 스터디] BE 1기 세번째 발자국

섹션 5. 책 요구사항 구현하기

 

  1. JPA에서 연관관계를 매핑하기

  • 연관관계의 주인: "상대 테이블을 가리키는 테이블"

    • Table을 바라보았을 때 누가 관계의 주도권을 가지고 있는지를 의미함.

    • JPA에도 알려주는 법: 연관관계의 주인이 아닌 객체에서 @OneToMany와 같은 연관관계 어노테이션에 mappedBy 옵션을 표시한다.

    • 연관관계 주인의 효과: 연관관계의 주인을 기준으로 테이블이 연결된다.

      • 예를 들어, 연관관계의 주인인 personsetAddress 를 통해 테이블을 이어주지만, address로 같은 메서드를 실행하면 제대로 테이블이 연결되지 않는다.

        person.setAddress(address); // 정상 실행
        address.setPerson(person);
    • 연관관계의 주인을 통해 객체를 이어줘도, 반대쪽도 이어지는 것은 아니므로 하나의 setter 안에서 객체끼리 완전히 연결시켜 주어야 한다.

      • 연관관계의 주인인 personsetAddress 내에서 addressPerson도 설정해 준다.

public void setAddress(Address address) { 
  this.address = address; 
  this.address.setPerson(this); 
}
  • 연관관계를 나타내는 어노테이션

     

    • @OneToMany@ManyToOne: N : 1 관계

    • @OneToOne: 1 : 1 관계

    • @ManyToMany: N : M 관계 (*N : M 연관관계의 구조는 복잡하고, 테이블도 직관적으로 매핑되지 않기 때문에 사용하지 않는 게 좋음)

       

  • JPA 연관관계의 다양한 옵션

     

    • mappedBy 옵션: 연관관계의 주인이 아닌 객체가 주인에게 매여 있음을 표시한다.

    • @JoinColumn: 연관관계의 주인에게 활용할 수 있는 어노테이션. 연관관계의 주인이 가지고 있는 다른 테이블을 가리키는 필드의 이름이나 null 여부, 유일성 여부, 업데이트 가능 여부 등을 정해줄 수 있다.

    • cascade 옵션: 한 객체가 저장되거나 삭제될 때, 연결되어 있는 객체도 함께 저장되거나 삭제되는 기능

    • orphanRemoval 옵션: 연관관계가 끊어진 데이터를 자동으로 제거해 준다.

    • fetch 옵션: 객체의

      지연 로딩 여부를 설정한다. 꼭 필요할 때 가져오는 LAZY 옵션(기본 옵션), 처음 데이터를 로딩할 때 바로 가져오는 EAGER 옵션이 있다.

      • 지연 로딩: 영속성 컨텍스트의 특징. 필요한 순간에 연결되어 있는 객체를 가져온다.

  • 연관관계를 사용하면?

    • 도메인 계층에서 두 클래스가 직접 협업할 수 있으므로 Service 계층의 코드가 더 간결해진다.

    • 하지만 연관관계를 너무 지나치게 사용하면 시스템 파악이 어려워지고 한 곳에서의 수정이 다른 곳까지 영향을 줄 수도 있으므로 여러 부분을 고민하며 연관관계 사용 여부를 결정해야 한다.


섹션 6. 생애 최초 배포 준비하기

 

  1. 배포란 무엇인가

     

    • 필요한 프로그램(ex. spring, MySql..)이 설치된 전용 컴퓨터에 코드를 옮기고 실행하는 과정

    • profile 설정하기

      • 똑같은 서버 코드를 local profile에서는 H2 DB로, dev profile에서는 MySQL DB를 사용하도록 설정할 수 있다.

      • application.yml의 설정 값도 함께 변경해 주어야 함.

       

  2.  

     git과 github

  • git: 코드를 쉽게 관리할 수 있도록 해주는 버전 관리 프로그램

  • github: git으로 관리되는 프로젝트의 코드가 저장되는 저장소

  • 코드를 github 저장소에 저장하는 과정

    • git add .: 모든 코드를 담는다.

    • git commit -m "메시지": 파일들을 포장하고 적고 싶은 문장을 적는다.

    • git push: 송장을 붙인 파일들을 github에 보낸다.

  1. EC2: Elastic Compute Cloud의 약자로, 탄력적으로 원격 컴퓨터를 사용할 수 있다는 의미.


섹션 7. 생애 최초 배포하기

  1. 리눅스 명령어

  • mikdir 폴더이름 - 폴더를 만든다

  • ls - 현재 위치에서 폴더나 파일을 확인한다

    • ls -l - 폴더의 자세한 정보를 확인한다

       

      • 접근권한 명령어가 표시된다. 이를 변경하는 명령어가 chmod다.

         

  • cd 폴더이름 - 폴더 안에 들어간다.

    • cd .. - 현재 위치에서 상위 폴더로 간다.

  • pwd - 현재 위치를 확인한다.

     

  • rmdir 폴더이름 - 비어있는 디렉토리를 제거할 수 있도록 한다.

  1. foreground와 background

  • foreground: 우리가 보고 있는 프로그램

  • background: 우리가 보고 있지 않은데 실행 중인 프로그램

    • EC2 접속을 종료해도 서버가 동작하게 하려면 서버가 background에서 동작할 수 있도록 명령어를 추가해야 한다.

      • jar 파일 실행 명령어의 앞뒤로 nohup [명령어] &를 붙여준다.

        • ex. nohup java -jar build/libs/library-app-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev &

      • rm nohup.out - nohup.out 파일을 제거한다.

        • nohup.out 파일을 확인하는 방법

          • 리눅스 편집기 vim을 활용: vi nohup.out 입력

          • 접속한 터미널에서 확인: cat nohup.out or tail -f nohup.out

    • background로 동작하고 있는 서버 종료하기

      • 리눅스 작업 관리자 명령어 ps aux를 사용해 실행 프로그램 목록을 볼 수 있다. (*java 관련 프로그램만 보고 싶다면 ps aux | grep java)

      • 프로그램마다 고유한 번호가 있으므로 kill -9 번호를 입력하면 서버 프로그램이 종료된다.


섹션 8. Spring Boot의 이모저모

 

  1. Spring Boot와 관련된 여러가지 사항

  • build.gradle:

    gradle을 이용해 프로젝트를 빌드하고 의존성을 관리하기 위해 작성한 파일

  • Spring과 Spring Boot

     

    • Spring Boot는 Spring에서 제공하는 편리한 기능을 사용하기 위해 필요한 설정을 Java의 어노테이션 기반으로 가능하게 하고, 기본적인 설정들은 모두 자동으로 해준다.

    • Spring Boot의 starter로 의존성 관리가 쉬워졌고, starter 추가만으로 원하는 기술을 쉽게 도입할 수 있게 되었다.

       

  • application.ymlapplication.properties:

    스프링 설정에 활용된다. YAML 방법이 가독성이 좋다.

  • lombok : getter나 생성자, setter, equals, toString 등을 자동으로 만들어준다.

    • 어노테이션 @Getter, @NoArgsConstructor, @RequiredArgsConstructor(final이 붙어 있어 필수로 값 필요한 변수들을 가지고 있는 생성자를 만든다), @Setter, @EqualsAndHashCode, @ToString 등이 있다.


<3주차 학습 내용 회고>

  • 완성한 서버를 배포해 보는 경험을 처음 경험해 본 일주일이었다. 강의에서 제공된 완벽한 코드를 실행시킨 것 뿐이지만, 지금까지 했던 코드의 터미널 실행과는 또 다른 느낌의 기쁨을 느낄 수 있었다. 깃 허브는 사실 아직도 잘 모르겠지만, 첫 시작을 했으니 다음에 사용할 때는 조금 더 여유롭게 사용할 수 있을 것 같다.

  • 연관관계를 따져보는 내용은 디비 수업에서 배웠던 것의 연장선에 있는 듯한데, 비슷하면서도 개념이 완전히 같지는 않아서 실제로 개발할 때 공부가 더 필요할 부분인 듯하다.

  • 본 강의 내용은 이번 주로 드디어 끝이 났다. 아직 남은 부분이 있긴 하지만, 이렇게 빠듯한 일정으로 강의를 다 수강해 본 게 얼마 만 인지 모르겠다. 남은 내용들도 잘 챙겨가서 다음 단계 공부에 잘 활용해 보고 싶다.

     

 

<미션>

  • 과제6

    • API 3단 분리, Repository 분리하기

    • API 분리는 전에 해두었던 것을 좀 더 간결하고 가독성 좋게 만드는 방식으로 만들었다.

    • Repository의 경우 원래 만든 Repository의 볼륨이 상대적으로 컸기에 잘못 분리하면 에러 파티가 날 수도 있겠다 싶어서 살짝 부담스러웠지만 그래도 잘 분리할 수 있었다.

  • 과제7

    • 기존 코드를 JPA를 통해 동작하도록 변경하기

    • 왠지 모르겠지만 굉장히 오래 걸렸다. 첫 몇 시간은 아예 과제 주제를 착각해서 허송세월을 보내기도 했다. 차근차근 강의록을 다시 읽어보면서 내용을 과제에 적용하려고 했다.

    • 기존 코드는 쿼리를 직접 작성해야 했기에 문자열 " "안에 작성한다는 것이 매우 부담스러웠는데, 훨씬 간편해졌다. 다른 분들의 코드도 몇 개 참고했는데 JPA에서 제공하는 기능으로 쿼리를 원하는 대로 작성해서 데이터를 뽑아낸 경우도 있었다. 그런데 복잡해 보이기도 하고 나는 강의에서 다뤄진 내용으로 해보고 싶어서 기본 메소드를 사용했다. 나중에 필요할 때가 분명 있을 테니 그 때 활용해 보기로 했다.

    • 앞선 과제를 계속해서 더 간결하고 편리하게 사용할 수 있는 쪽으로 개선하는 과제가 많았는데, 이 과제들이 아니었다면 난 곧장 JPA만을 이용해 코드를 짰을 것이다.(아마도) 차근차근 순서대로 같은 기능을 하는 다른 코드들을 시간을 들여 작성해 보는 시간들이 매우 소중하다는 걸 느낀 과제였다.

댓글을 작성해보세요.

채널톡 아이콘