내일배움캠프 D+36: 0523

enyo9rt·2022년 5월 23일

TIL-S

목록 보기
25/79

🧾 데이터베이스: 1주차

데이터를 불러오고 (Select), 조건에 맞게 필터링 하는 것 (Where)!

CRUD 중 실무에서는 Read 할 일이 제일 많기 때문에 그 위주로 학습한다.
원하는 데이터를 잘 꺼내올 수 있는 주니어 개발자를 목표로~

SQL 쿼리를 작성한다? 데이터를 가져오는 명령어를 작성하는 것
쿼리(Query)문이란? 쿼리는 질의, 즉 데이터베이스에 명령을 내리는 것을 의미

파일 시스템데이터베이스 모델링관계형 데이터베이스
파일(file)엔터티(Entity)테이블(table)
레코드(record)튜플(Tuple)행(row)
키(key)유일값(identifier)기본키(Primary key), unique
필드(field)어트리뷰트(attribute)컬럼(column)

출처

show tables 테이블 가져오기
select * from orders 모든 필드 가져오기

주의! 문자열은 따옴표!

  • WHERE절과 같이 쓰기
    같지않음 !=
    범위 BETWEEN
    포함 IN
    패턴 LIKE
    일부만 LIMIT 큰 테이블 살펴볼 때
    중복제외 DISTINCT
    카운트 COUNT
    ++COUNT와 DISTINCT 같이 쓰기

📑 Gmail을 사용하는 2020/07/12~13에 가입한 유저의 수를 세기
>>날짜 문자열 주의!

select count(*) from users
where created_at between "2020-07-12" and "2020-07-14"
and email like "%gmail%";

🍃 웹개발의 봄, Spring: 2주차

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!

SpringMYSQL
Domain (Entity)Table
RepositorySQL

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 처음 배울 때 느낌이 난달까... 아직은 낯설다ㅎㅎ;; 새삼 느끼는 거지만 어영부영이라도 따라하고 반복하는 게 내겐 좋은 것 같다. 내일도 데이터베이스 듣기 전 복습을 잠깐 한 후에 듣고, 스프링도 마찬가지로 복습을 해야할 듯하다.

0개의 댓글