CRUD 중 실무에서는 Read 할 일이 제일 많기 때문에 그 위주로 학습한다.
원하는 데이터를 잘 꺼내올 수 있는 주니어 개발자를 목표로~
SQL 쿼리를 작성한다? 데이터를 가져오는 명령어를 작성하는 것
쿼리(Query)문이란? 쿼리는 질의, 즉 데이터베이스에 명령을 내리는 것을 의미
| 파일 시스템 | 데이터베이스 모델링 | 관계형 데이터베이스 |
|---|---|---|
| 파일(file) | 엔터티(Entity) | 테이블(table) |
| 레코드(record) | 튜플(Tuple) | 행(row) |
| 키(key) | 유일값(identifier) | 기본키(Primary key), unique |
| 필드(field) | 어트리뷰트(attribute) | 컬럼(column) |
show tables 테이블 가져오기
select * from orders 모든 필드 가져오기
주의! 문자열은 따옴표!
📑 Gmail을 사용하는 2020/07/12~13에 가입한 유저의 수를 세기
>>날짜 문자열 주의!
select count(*) from users
where created_at between "2020-07-12" and "2020-07-14"
and email like "%gmail%";

RDBMS Relational Database Management System
컴퓨터에 정보를 저장하고 관리하는 기술 (고도화된 엑셀)
SQL Structured Query Language
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)
);
bigint: SQL에서 long을 가리킴
varchar: String을 가리킴
PRIMARY KEY(id): id를 기본키로 하겠다!
AUTO_INCREMENT: 자동으로 ++
그럼 SQL언어를 모두 배워야할까? NO!
-> JAVA로 SQL언어를 번역해주는 Spring Data JPA!
| Spring | MYSQL |
|---|---|
| Domain (Entity) | Table |
| Repository | SQL |
domain.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;
}
}
Repository에서 다 설정을 해주기 때문에 getter만 설정해주면 된다.
JPA
Ropository 인터페이스에서만 사용할 수 있다.
인터페이스? 클래스에서 필드없는, 메소드 모음집!
domain.CourseRepository.java
public interface CourseRepository extends JpaRepository<Course, Long> { // Course이고, id의 형태가 Long이다
}
생성일자, 수정일자
Course.java에 상속해주고 메인 클래스 위에
@EnableJpaAuditing (Timestaped 연결) 어노테이션 붙여주기!
domain.Timestamped.java
@MappedSuperclass // 상속했을 때, 컬럼으로 인식하게 합니다.
@EntityListeners(AuditingEntityListener.class) // 생성/수정 시간을 자동으로 반영하도록 설정
public class Timestamped {
@CreatedDate // 생성일자임을 나타냅니다.
private LocalDateTime createdAt;
@LastModifiedDate // 마지막 수정일자임을 나타냅니다.
private LocalDateTime modifiedAt;
}
Controller --- Service --- Repo --- DB
이렇게 응답기와 DB에서 가져오는 Repo 사이에는 연결 고리인 Services가 있는데,
CRUD 중 Update의 경우 Service에 작성해야 한다.
Lombok
class 위에 @Getter @Setter 등을 써주면 알아서 해준다!
@RequiredArgsConstructor 변수를 final 선언하고 생성자 주입
✅ 위처럼 생성자를 주입했더니 POST API 구현하면서 기본 생성자가 없다는 컴파일 에러가 났다. 일단 final 선언을 해제하고 기본 생성자 어노테이션을 달아준 후, 매개변수를 받는 생성자를 하나 만들어 줬더니 에러가 생기지 않았다.
DTO(Data Transfer Object) 완충재 역할!
Entity인 Course 클래스를 보호하는데 쓰였다.
API
POST / GET / PUT / DELETE
.orElseThrow() 예외 처리 하는 법
@PathVariable 변수 값이 유동적일 때
@RequestBody 데이터를 담는 요청본문. 강의에서는 POST와 PUT에 쓰였다.
└ 참고
SAVE 💾
SQL 1주차는 난이도가 높지 않아 수월했다. 시간이 좀 남아서 오늘 스프링 강의를 들은 후에 자바 공부를 하려고 했더니, 스프링 강의를 중간에 끊기가 뭣해서 2주차 끝까지 듣기로 결정했다. CRUD API는 다 만들어 봤는데 마치 AJAX 처음 배울 때 느낌이 난달까... 아직은 낯설다ㅎㅎ;; 새삼 느끼는 거지만 어영부영이라도 따라하고 반복하는 게 내겐 좋은 것 같다. 내일도 데이터베이스 듣기 전 복습을 잠깐 한 후에 듣고, 스프링도 마찬가지로 복습을 해야할 듯하다.