[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 라는 컬럼을 만들어 두었습니다. 이것이 자바로 어떻게 표현되는지 살펴볼게요!
- src > main > java > com.sparta.week02에 domain 이라는 패키지를 만듭니다.
- Course.java, CourseRepository.java 파일을 만듭니다.
** 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; } }
** 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가지 영역으로 나눌 수 있습니다.
Controller : 가장 바깥 부분, 요청/응답을 처리함.
→ 2주차 후반부에 배울 녀석
Service : 중간 부분, 실제 중요한 작동이 많이 일어나는 부분
→ 지금 배울 녀석
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 는 생성 요청 입니다.