[Spring] Week02

JPA, Repository

  • RDBMS, 줄여서 RDB는 관계형 데이터베이스를 말합니다.
  • H2는 RDBMS의 한 종류로, 서버가 켜져있는 동안에만 작동하는 RDB입니다.
  • SQL은 데이터를 읽고, 저장하고, 변경하고, 삭제하는 구체적인 문법입니다.

스프링은 자바로 작동하고, 데이터베이스는 SQL로 작동합니다. 한국어와 영어 사이에는 번역기가 필요하죠? 자바를 위한 번역기, JPA 사용법을 배워봅니다.

  • JPA(Spring Data JPA)는 스프링을 위해 태어난 녀석인데요.
  • Java로 코드를 작성하면 SQL로 번역해줄 뿐만 아니라, 기본적인 기능이 거의 완벽하게 들어있습니다.
  • Repository는 JPA를 작동시키는 매개체입니다.

클라이언트 - 서버 간의 약속인 API와 데이터를 주고받는 구체적인 방법에 대해 배웁니다.

  • API 요청에도 다양한 방식이 있습니다. 생성, 조회, 수정, 삭제 각각에 맞는 방법을 알아봅니다.
  • 스프링은 데이터를 주고받는 방법을 강제합니다. 어떻게 하면 올바르게 주고받을 수 있는지 배웁니다.
  • 현업에서는 데이터를 주고받을 때, DTO를 반드시 이용합니다. 왜 그러한지 이유와 방법을 배웁니다.

  • JPA란?

    JPA는, SQL을 쓰지 않고 데이터를 생성, 조회, 수정, 삭제할 수 있도록 해주는 번역기입니다.

  • JPA가 없다면?

    • 자바 짜다가 갑자기 SQL 짜고, 그걸 잘 맞추어 넣어야 합니다. 복잡하네요 😇
  • JPA가 있다면?

    • 설정은 아래 한 줄이면 끝나고요
        implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  • Domain, Repository 소개

    • 자바로 DB를 사용하도록 도와주는 녀석이 JPA 라고 말씀드렸습니다.
    • 그럼 DB를 이용하는데 핵심이었던 “테이블”과 “SQL”과 동일한 개념의 자바 용어가 있겠죠?
    • “테이블”은 Domain, “SQL”은 Repository 입니다.
  • Domain, Repository 도입하기

    우리는 courses 라는 테이블에 title, tutor 라는 컬럼을 만들어 두었습니다. 이것이 자바로 어떻게 표현되는지 살펴볼게요!

    1. src > main > java > com.sparta.week02에 domain 이라는 패키지를 만듭니다.
    2. Course.java, CourseRepository.java 파일을 만듭니다.
    3. ** Course.java 클래스**

      @NoArgsConstructor // 기본생성자를 대신 생성해줍니다.
      @Entity // 테이블임을 나타냅니다.
      public class Course {
      
          @Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
          @GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령입니다.
          private Long id;
      
          @Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
          private String title;
      
          @Column(nullable = false)
          private String tutor;
      
          public String getTitle() {
              return this.title;
          }
      
          public String getTutor() {
              return this.tutor;
          }
      
          public Course(String title, String tutor) {
              this.title = title;
              this.tutor = tutor;
          }
      }
      
    4. ** CourseRepository.java 인터페이스**

      public interface CourseRepository extends JpaRepository<Course, Long> {
      }
      
    • Interface 란?
      • JPA는 Repository를 통해서만 사용할 수 있습니다.
      • 인터페이스는 클래스에서 멤버가 빠진, 메소드 모음집이라고 보시면 됩니다.

  • ** SQL이 보이도록 application.properties 세팅**

    spring.jpa.show-sql=true
    
  • JPA 사용해보기

    • ** JPA 실행 코드**

      // Week02Application.java 의 main 함수 아래에 붙여주세요.
      @Bean
      public CommandLineRunner demo(CourseRepository repository) {
          return (args) -> {
      
          };
      }
      
    • 웹콘솔 접속해서 확인해보기

      SELECT * FROM course;
      

    위 코드는 낯선 개념이 갑자기 많이 나옵니다. 하지만 겁먹지 말기! 왜나하면요.. 우리 수업에서 이번만 쓰고 다시는 안 쓰는 코드에요.

    @Bean, 익명 함수 등은 실무에서 중요한 것들이 맞습니다. 하지만 중요한 건 지금 단계에서 필요한게 아니라는 거에요.

    여기서 전부 이해하자고 하면, 그리고 앞으로 모르는게 나올 때마다 100% 알고 넘어가려고 하면 스프링은 그 양이 너무나 방대해서 법전 같은 책 두 권은 족히 떼야 할 거에요.

    그렇게 개발을 익히면 너무 오래 걸립니다. 지쳐요. 만드는 재미를 잊어버립니다.


  • 상속의 개념

    • “extends” 라는 단어를 Repository에서 보았어요. 이게 대체 뭘까요?
    • “클래스의 상속”이라는 개념인데요. “이미 만들어둔거 가져다 쓰자!” 라고 선언하는 것입니다.
    • Tutor extends Person 과 같이 쓸 수 있습니다. 좀 더 살펴볼까요?

      class Person {
      	private String name;
      	private String getName() {
      		return this.name;
      	}
      }
      
      class Tutor extends Person {
      	private String address;
      	// Person 클래스를 상속했기 때문에,
      	// name 멤버변수와 getName() 메소드를 가지고 있습니다.
      }
      
      
  • 상속 연습해보기 - Timestamped

    DB 기본 중의 기본은, “생성일자”와 “수정일자”를 필드로 가지는 것입니다.

    • Course 클래스가 course 테이블이 되는 것, 살펴보셨죠?
    • Course 클래스에 생성일자/수정일자 멤버를 추가해보겠습니다.
    • ** Timestamped.java**

      @MappedSuperclass // 상속했을 때, 컬럼으로 인식하게 합니다.
      @EntityListeners(AuditingEntityListener.class) // 생성/수정 시간을 자동으로 반영하도록 설정
      public class Timestamped {
      
          @CreatedDate // 생성일자임을 나타냅니다.
          private LocalDateTime createdAt;
      
          @LastModifiedDate // 마지막 수정일자임을 나타냅니다.
          private LocalDateTime modifiedAt;
      }
      
    • Course 클래스에 아래와 같이 붉은색 글자를 추가합니다.

      class Course extends Timestamped {
      
    • Week02Application 클래스에 다음과 같이 붉은색 글자를 추가합니다.

      @EnableJpaAuditing
      @SpringBootApplication
      public class Week02Application {
      

JPA 심화

🎖CRUD란? 정보관리의 기본 기능 → 생성 (Create) → 조회 (Read) → 변경 (Update) → 삭제 (Delete)

JPA로 위의 기능을 하는 방법을 익혀보겠습니다.

인텔리제이에서 ctrl+ alt+l 누르면 자동정렬

update, delete 로 넘어가기 전에, 다루어야 하는 개념이 바로 Service 입니다.

  • 스프링의 구조는 3가지 영역으로 나눌 수 있습니다.

    1. Controller : 가장 바깥 부분, 요청/응답을 처리함.

      → 2주차 후반부에 배울 녀석

    2. Service : 중간 부분, 실제 중요한 작동이 많이 일어나는 부분

      → 지금 배울 녀석

    3. Repo : 가장 안쪽 부분, DB와 맞닿아 있음.

      → 여태 배운 녀석 (Repository, Entity)

  • Update 는 Service 부분에 작성합니다.


Lombok(이하 롬복)은, 자바 프로젝트를 진행하는데 거의 필수적으로 필요한 메소드/생성자 등을 자동생성해줌으로써 코드를 절약할 수 있도록 도와주는 라이브러리입니다.

  • Course.java

    Course 클래스 Getter, NoArgsConstructor 적용

  • CourseService.java

    CourseService 클래스 RequiredArgsConstructor 적용


테이블을 막 건드려도 될까? = read, update할 때 Course 클래스를 막 써도 될까? = 내가 아닌 다른 사람이 변경이라도 한다면?? 😱

완충재로 활용하는 것이 DTO(Data Transfer Object)입니다.


  • API

    클라이언트 - 서버 간의 약속입니다.

    클라이언트가 정한대로 서버에게 요청(Request)을 보내면, 서버가 요구사항을 처리하여 응답(Response)을 반환합니다.

  • REST

    REST란, 주소에 명사, 요청 방식에 동사를 사용함으로써 의도를 명확히 드러냄을 의미합니다.

    • 여기에 쓰이는 동사는 우리가 JPA 시간에 배운 CRUD를 지칭합니다.
    • 즉 A에 대해 생성(POST)/조회(GET)/수정(PUT)/삭제(DELETE) 요청을 하는 것이죠.
    • 예시
      • GET /courses → 강의 전체 목록 조회 요청
      • GET /courses/1 → ID가 1번인 녀석 조회 요청
      • POST /courses → 강의 생성 요청
      • PUT /courses/3 → ID가 3번인 녀석 수정 요청
      • DELETE /courses/2 → ID 2번인 녀석 삭제 요청
    • 주의사항
      • 주소에 들어가는 명사들은 복수형을 사용합니다.
        • /course
      • 주소에 동사는 가급적 사용하지 않습니다.
        • /accounts/edit

Post 는 생성 요청 입니다.





© 2021.03. by yacho

Powered by github