Spring 개발일지 EP.2
* 목표 *
- RDBMS의 기초 지식을 습득한다.
- Spring Data JPA의 사용법을 습득한다.
- REST API를 만드는 방법을 익힌다.
- RDBMS는 Relational DataBase Management System
관계형 디비이다. 우리가 흔히 쓰는 MySQL이 대표적이고, PostgreSQL 등이 있다.
우린 H2를 사용하면서 '서버가 작동될때만 데이터를 저장하거나 하는 DB'를 알아볼것이다.
우선 src > main > resources > application.properties 파일에 H2 웹콘솔 설정을 한다.
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
이후 실행하면
http://localhost:8080/h2-console 접속 후 connect하면 됨. 쿼리문은 대충 하면된다.(알아서 터득하길 구글링 ㄱㄱ)
// 테이블 생성
CREATE TABLE IF NOT EXISTS tutors (
id bigint(5) NOT NULL AUTO_INCREMENT, //이거 안되면 bigint지우고 int만 해봥
name varchar(255) NOT NULL,
age bigint(5) NOT NULL,
PRIMARY KEY (id)
);
// 데이터 삽입
INSERT INTO tutors (name, age) VALUES
('손흥민', 30);
// 데이터 조회
SELECT * FROM tutors;
그래도 보면은 아니까 아무값 넣어줄게
자 그런데 여기서 우린 쿼리문 다 알 필요가 없다는 사실이다. 왜냐하면
JPA가 다 해주거든. 어떤식이냐면 우리가 Java로 명령어를 적어주면 SQL문(생성, 삽입, 조회 명령문)으로 번역해주거든?
그럼 JPA가 뭔지 알아보자
- JPA(Spring Data JPA) : Java로 코드를 작성하면 SQL로 번역해줄 뿐만 아니라, 기본적인 기능이 거의 들어있다.
쉽게 말하면
스프링은 자바로 작동하고, 데이터베이스는 SQL로 작동한다!
한국어와 영어 사이에는 번역기가 필요하듯. 자바를 위한 번역기 = JPA !!!
1) Domain, Repository 이란?
스프링 | (오라클디벨로퍼, MySQL, 포스그레 디비 등등) |
Domain | Table |
Repository | SQL(생성, 삽입, 조회 명령문) |
표를 보면 동일한 개념으로 적어두었다.
Domain은 Table 개념, Repository는 SQL 개념을 가지고있다.
그러면 Table을 만들떄 Domain 패키지에서 java파일 작성 후 JPA를 통해 테이블을 설정!
SQL문은 Repository에 패키지 -> java 파일 생성 후 JPA를 통해 쿼리문 설정!
그럼 코드를 통해서 JAVA클래스 파일로 어떻게 테이블과 컬럼을 만드는지 알아보자
@NoArgsConstructor // 기본생성자를 대신 생성!
@Entity // 테이블임을 알려줌!
public class Course { //Course라는 테이블(JAVA클래스)를 만들어줌!!
@Id // ID 값, Primary Key로 사용하겠다 의미!
@GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령(구글링 ㄱㄱ)
private Long id;
@Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냄. NOT NULL
private String title;
@Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냄. NOT NULL
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;
}
}
여기서 문제! 이건 Domain일까요 Repository일까요?
정답은 [ Domain ] ~ 패키지에서 만들어야한다!
(src > main > java > com.sparta.week02 아래 domain패키지 생성)
아래 Course, CourseRepositiory 자바 파일 생성하는 구조이다. Course를 움직이려면 CourseRepository 허락을 받아야한다.(쉽게 생각하면 ^^:)
그럼 CourseRepositiory 는 어디있느냐???
public interface CourseRepository extends JpaRepository<Course, Long> {
}
CourseRepository.java 인터페이스를 만드는데
또 문제가 생긴다 Interface 란 뭐냐 이거다...
하필 JPA는 Repository를 통해서만 사용할 수 있다.
즉 인터페이스는 클래스에서 멤버가 빠진, 메소드 모음집이라고 보면 된다.
(추가 내용 중요도 별3개 ) : extends 라는 상속 선언한거 다들 아시려나?...
Tutor extends Person를 해보면
class Person {
private String name; // 멤버변수name
private String getName() {
return this.name;
}
}
class Tutor extends Person { // Person 클래스를 상속
private String address;
//Tutor클래스는 name 멤버변수와 getName() 메소드를 가지고 있음
}
자! 이제 JPA를 사용해봐야겠지?
우선 application.properties에서 복붙 하고
spring.jpa.show-sql=true
spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL
마지막 JPA실행 코드가 또 있다...
// Week02Application.java 의 main 함수 아래 복붙!
@Bean
public CommandLineRunner demo(CourseRepository repository) {
return (args) -> {
};
}
이렇게 하고 웹에 접속해서 SELECT * FROM course;해보면 나온다...
- Repository는 JPA를 작동시키는 매개체다
우선 시작하기전 복습겸 되집어 보자(이유는 어려우니까 한번더 해서 나쁠건 없자나...)
1. Controller - 클라이언트 요청을 전달 받는 코드! (요즘 json형식으로 많이 사용하니까 'RestController'로 JSON만 돌려줌)
RestConroller 만들기
src-main-com.sparta.week01 아래 컨트롤러 패키지 생성
패키지에 CourseController.java 생성
@RestController
public class CourseController {
@GetMapping("/courses")
public Course getCourses() {
Course course = new Course();
course.setTitle("스프링");
course.setDays(28);
course.setTutor("마법사");
return course;
}
}
json(=데이터를 서버에서 전달받는 형식을 JSON)이고
지금 하는건 스프링 서버를 만들고-> 클래스 정보를 json으로 나타내는거라고 생각하면 된다.
그럼 @GetMapping이 보일텐데 이게 뭐냐면
웹에선 Get방식으로 정보요청을 하는데 이때 GETMAPPING을 해주면서
HTTP://localhost:1234/courses 로 접속시 getCourses()를 실행한다. 그러면 "스프링, 28, 마법사"
이걸 return받고 RestController니까 JSON형식으로 브라우저에 나타날 것이다.
자! 복습은 다했고 이제 본격적으로 해보자.