각 제품 간 차이가 크지 않아서 사실 어떤 걸 사용하든 좋습니다. 유료인 Oracle을 제외하고 보통 MySQL, PostgreSQL 중에서 많이 고르는 편인데, 우리는 실제 배포 시 MySQL을 사용합니다.
# 스프링에 h2라는 데이터 변수 콘솔을 보이게 해줘
spring.h2.console.enabled=true
#스프링에 데이터베이스를 뭘 쓸거냐면? h2를
spring.datasource.url=jdbc:h2:mem:testdb
Week02Application 서버 실행 → localhost:8080 → localhost:8080/h2-console
Connect 클릭!
EX)
- 노란줄 : 엑셀 파일 하나가 "데이터베이스"
- 하늘색 :엑셀 시트 하나는 "테이블" 행과 열이 존재
- 빨간색 : 엑셀 행 하나는 "데이터"라고 부릅니다.
재생버튼 클릭!
CREATE TABLE IF NOT EXISTS courses (
(만얀에 존재를 안한다면 courses 테이블을 만들어라)
id bigint(5) NOT NULL AUTO_INCREMENT,
(NOT NULL : ID를 꼭 가지고 있어야된다.
title varchar(255) NOT NULL,
(
tutor varchar(255) NOT NULL,
(
PRIMARY KEY (id)
(
);
NOT NULL : 꼭 가지고 있어야될 정보.
bigint : INT , LONG 같은 정수.
varchar : STRING 문자열.
PRIMARY KEY (ID) : 내가 구분할 수 있는 키를 ID로 지정하겠다.(중복될 수 없는 값으로 지정.)
ID : ID값은 중복 불가. DATA 하나 하나 행을 구분하기 위한 유일한 값.
AUTO_INCREMENT : 자동으로 증가. (ID 1 , ID 2 ...)
Data 삽입 → 재생버튼 클릭!
INSERT INTO courses (title, tutor) VALUES
(courses 테이블에 (1)title, (2)tutor Data를 넣어줘 그 값은(VALUES)
첫번째 ('웹개발의 봄, Spring'(title), '남병관'(tutor), 두번째('웹개발 종합반'(title), '이범규'(tutor));
SELECT * FROM courses; 작성 → 재생버튼 클릭!
우리가 명령을 내린 Java 명령어를 SQL로 번역해주는 녀석이,
바로 다음 시간에 배울 Spring Data JPA 라는 녀석입니다!
이 녀석이 없었다면 우리는 진짜 필요한 개발을 하는 시간보다
SQL 만드느라 훨씬 많은 시간을 소비했을지 모릅니다.
name, age 라는 열을 가진 tutors 라는 테이블을 만들고,
나의 이름과 나이 데이터를 삽입해보세요.
그 다음에 tutors 테이블을 조회해보세요.
bigint 값은 숫자만 기입 ''없어도 됨. ex) name varchar '최성원' age 32
JPA는, SQL을 쓰지 않고 데이터를 생성, 조회, 수정, 삭제할 수 있도록 해주는 번역기입니다.
courses 라는 테이블에 title, tutor 라는 컬럼을 만들어 두었습니다.
이것이 자바로 어떻게 표현되는지 살펴볼게요!
package com.sprta.week02.domain;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@NoArgsConstructor // 기본생성자를 대신 생성해줍니다.
@Entity // 데이터베이스에서 테이블 역할하는 클레스
public class Course {
// ------------------------------------------------------------------------------
// 아래 ---부터 ---코드는 SQL 테이블 생성
// CREATE TABLE IF NOT EXISTS courses (
// id bigint(5) NOT NULL AUTO_INCREMENT,
// title varchar(255) NOT NULL,
// tutor varchar(255) NOT NULL,
// PRIMARY KEY (id)
// );
// NOT NULL = nullable = false
// Column = 데이터베이스에 열과 같음
// GeneratedValue = 자동증가
// strategy = GenerationType.AUTO = AUTO_INCREMENT
@Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
@GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령입니다.
private Long id; // long = bigint
@Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
private String title; // string = varchar
@Column(nullable = false)
private String tutor;
//--------------------------------------------------------------------------------
// Getter -------------------------------------------------
// ID는 데이터베이스에서 사용으로 Getter 필요 없음.
public String getTitle() {
return this.title;
}
public String getTutor() {
return this.tutor;
}
// Getter -------------------------------------------------
// Setter를 설정하지 않는 이유는 리포지탈이라는 자동으로 실행.
// CLASS------------------------------------
public Course(String title, String tutor) {
this.title = title;
this.tutor = tutor;
}
// CLASS------------------------------------
}
@Entity 에러 설정
@Id 오류도 위와 같이 동일
spring.jpa.show-sql=true
세팅 코드 삽입
package com.sprta.week02;
import com.sprta.week02.domain.Course;
import com.sprta.week02.domain.CourseRepository;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import java.util.List;
@SpringBootApplication
public class Week02Application {
public static void main(String[] args) {
SpringApplication.run(Week02Application.class, args);
}
// Week02Application.java 의 main 함수 아래에 붙여주세요.
// 실제로 사용하지 않음 이해를 위해 임시로 작성한 실행을 위한 코드
@Bean
public CommandLineRunner demo(CourseRepository repository) {
return (args) -> {
// 저장
// 빵틀 빵
Course course1 = new Course("웹개발의 봄 Spring", "남병관");
Course course2 = new Course("나는 최성원", "최성원");
repository.save(course1); // Course.java 테이블의 작성된 코드들을 가져다 쓸 수 있다. jpa 장점.
repository.save(course2);
// 조회
// 조회시 jpa 리턴시 Course에서 여러가지 오기때문에 List 사용.
List<Course> courseList = repository.findAll(); // ex) 만약 정확한 id로 찾고싶다 findById
// repository가 찾은 정보를 courseList 넣아줌
// 정보를 하나 하나 조회하려면 반복문을 사용
for (int i=0; i<courseList.size(); i++) {
System.out.println(courseList.get(i));
}
};
}
}
클래스를 만들고 저장하고 하나 하나 찍어보는것 숙달하는것이 중요 !!!!
Tutor extends Person 과 같이 쓸 수 있습니다.
class Person { // 클래스 Person 생성
private String name; // Person안에 String name 맴버변수가 있고
private String getName() { Getter가 있고
return this.name;
}
}
class Tutor extends Person { // 클래스 Tutor 생성 그게 만약에 extends Person이라면
private String address; // 어드레스라는 멤버만 선언해도 Person에 있는 전부 다 가져오겠다라고 자바에게 알려준다.
// Person 클래스를 상속했기 때문에,
// name 멤버변수와 getName() 메소드를 가지고 있습니다.
}
추가 설명
클래스에 extends Timestamped 추가.
@EnableJpaAuditing 추가
CRUD란? 정보관리의 기본 기능
id Getter 추가.
- Controller : 가장 바깥 부분, 요청/응답을 처리함.
→ 2주차 후반부에 배울 녀석- Service : 중간 부분, 실제 중요한 작동이 많이 일어나는 부분
→ 지금 배울 녀석- Repo : 가장 안쪽 부분, DB와 맞닿아 있음.
→ 여태 배운 녀석 (Repository, Entity)
Update 메소드 추가.
service 패키지 생성 및 CourseService 클래스 생성
Lombok(이하 롬복)은, 자바 프로젝트를 진행하는데 거의 필수적으로 필요한 메소드/생성자 등을
자동생성해줌으로써 코드를 절약할 수 있도록 도와주는 라이브러리입니다.
- Course.java
Course 클래스 Getter, NoArgsConstructor 적용
- CourseService.java
CourseService 클래스 RequiredArgsConstructor 적용
@Getter 오너테이션 추가.
@RequiredArgsConstructor 오너테이션 추가.
테이블을 막 건드려도 될까?
= read, update할 때 Course 클래스를 막 써도 될까?
= 내가 아닌 다른 사람이 변경이라도 한다면??
완충재로 활용하는 것이
DTO(Data Transfer Object)입니다.
클라이언트 - 서버 간의 약속입니다.
클라이언트가 정한대로 서버에게 요청(Request)을 보내면,
서버가 요구사항을 처리하여 응답(Response)을 반환합니다.
REST란, 주소에 명사, 요청 방식에 동사를 사용함으로써 의도를 명확히 드러냄을 의미합니다.
예시
GET /courses
→ 강의 전체 목록 조회 요청
GET /courses/1
→ ID가 1번인 녀석 조회 요청
POST /courses
→ 강의 생성 요청
PUT /courses/3
→ ID가 3번인 녀석 수정 요청
DELETE /courses/2
→ ID 2번인 녀석 삭제 요청
브라우저에서 접근하는 방식은 get
get 방식으로 동작하는 API
현업에서 API를 만들고 나면 각종 툴로 테스트 및 기능 확인을 정말 많이 하는데요.
그 중에서도 유용한 툴인 ARC를 함께 사용해보도록 하겠습니다.
API 실제 동작 확인
두가지
1. 테스트코드 작성해서 확인
2. 툴을 사용해서 확인 (ARC 등등..)
header 정보를 같이 보낸다
+ADD 클릭
headername → content-type = 데이터를 같이 보낼건데 데이터타입은 content-type이다.
application/json 왜 json형식으로 보내야되는 걸까? json형식이 대중적인 형태이다.
BODY 클릭!
생성된 POST 다시 GET으로 확인.
http://localhost:8080/api/courses/1
/1 수정할 ID 번호
"id": 1,
"title": "웹개발의 봄, Spring",
"tutor": "임민영"
이 데이터를
"title": "앱개발 종합반",
"tutor": "남병관" 이렇게 수정하겠다.
생성된 POST 다시 GET으로 확인.