Spring 2

최성원·2022년 1월 23일
0

Spring

목록 보기
2/4

Day-2

RDBMS (관계형 데이터베이스)

  • Table이라는 최소 단위로 구성된 데이터 모델.
  • 모든 데이터는 Table에 저장.
  • RDBMS(Relational DataBase Management System)은 컴퓨터에 정보를 저장하고 관리하는 기술입니다.
  • 성능/관리 면에서 매우 고도화된 엑셀 이라고 생각하셔도 좋습니다.

DBMS

  • 다수의 컴퓨터, 사용자들이 DB안에 데이터를 기록하거나 사용할 수 있도록 해주는 프로그램이다
  • 사용자들은 실제 데이터의 저장위치를 몰라도 언제든지 데이터를 사용할 수 있다.
  • 데이터 처리에 있어 무결성과 보안성을 제공.

RDBMS 종류

각 제품 간 차이가 크지 않아서 사실 어떤 걸 사용하든 좋습니다. 유료인 Oracle을 제외하고 보통 MySQL, PostgreSQL 중에서 많이 고르는 편인데, 우리는 실제 배포 시 MySQL을 사용합니다.

  • MySQL
  • PostgreSQL
  • Oracle Database

H2

  • In-memory DB의 대표 주자인 H2를, 4주차까지 사용해볼겁니다. 인메모리 DB란 서버가 작동하는 동안에만 내용을 저장하고,
    서버가 작동을 멈추면 데이터가 모두 삭제되는 데이터베이스를 말합니다.

MySQL

  • MySQL은 우리가 서비스를 배포할 때 사용할 데이터베이스입니다. AWS RDS 라는 서비스를 사용해 붙여볼 예정인데요.
    스프링과 궁합이 좋아서 많은 회사에서 사용하고 있답니다.

H2 웹콘솔 띄워보기

src > main > resources > application.properties 파일 열기.

# 스프링에 h2라는 데이터 변수 콘솔을 보이게 해줘
spring.h2.console.enabled=true
#스프링에 데이터베이스를 뭘 쓸거냐면? h2를
spring.datasource.url=jdbc:h2:mem:testdb


Week02Application 서버 실행 → localhost:8080 → localhost:8080/h2-console

서버 작동 확인.(Spring 작동)

h2 콘솔창

Connect 클릭!

web Console창

SQL 연습하기

Database

  • 매우 고도화된 엑셀이다.
  • 체계화된 데이터의 모임.
  • 구조적으로 데이터를 저장하는 공간. (파일 /파일모음)
  • 데이터를 효율적으로 처리 , 관리하기 위해 도입.
  • Table 형태로 데이터를 관리. (RDBMS)
  • DBMS을 이용하여 DB를 생성하고 제어.

EX)

  • 노란줄 : 엑셀 파일 하나가 "데이터베이스"
  • 하늘색 :엑셀 시트 하나는 "테이블" 행과 열이 존재
  • 빨간색 : 엑셀 행 하나는 "데이터"라고 부릅니다.

1) Table 생성

재생버튼 클릭!

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 ...)

2) Data 삽입

Data 삽입 → 재생버튼 클릭!

INSERT INTO courses (title, tutor) VALUES
(courses 테이블에 (1)title, (2)tutor Data를 넣어줘 그 값은(VALUES)
첫번째 ('웹개발의 봄, Spring'(title), '남병관'(tutor), 두번째('웹개발 종합반'(title), '이범규'(tutor));

3) Data 조회

SELECT * FROM courses; 작성 → 재생버튼 클릭!

  • 위에서 사용한 생성, 삽입, 조회 명령문을 SQL(Structured Query Language)이라고 합니다.
  • 그럼, 웹서비스를 만들기 위해 SQL을 모두 배워야할까요? 아닙니다!

우리가 명령을 내린 Java 명령어를 SQL로 번역해주는 녀석이,
바로 다음 시간에 배울 Spring Data JPA 라는 녀석입니다!

이 녀석이 없었다면 우리는 진짜 필요한 개발을 하는 시간보다
SQL 만드느라 훨씬 많은 시간을 소비했을지 모릅니다.

퀴즈)

문제

name, age 라는 열을 가진 tutors 라는 테이블을 만들고,
나의 이름과 나이 데이터를 삽입해보세요.
그 다음에 tutors 테이블을 조회해보세요.

1) Table 생성

2) Data 삽입


bigint 값은 숫자만 기입 ''없어도 됨. ex) name varchar '최성원' age 32

3) Data 조회

JPA 시작하기

JPA는, SQL을 쓰지 않고 데이터를 생성, 조회, 수정, 삭제할 수 있도록 해주는 번역기입니다.

  • 어렵고 코드가 복잡해진다.
  • RDBMS mySQL을 쓰다가 다른종류 RDBMS 쓰게된다면 문법을 RDBMS 종류에 맞게 재작성 및 검토.

  • 자바로 DB를 사용하도록 도와주는 녀석이 JPA
  • 그럼 DB를 이용하는데 핵심이었던 "테이블"과 "SQL"과 동일한 개념의 자바 용어가 있겠죠?
  • "테이블"은 Domain, "SQL"은 Repository

Domain, Repository 도입하기

courses 라는 테이블에 title, tutor 라는 컬럼을 만들어 두었습니다.
이것이 자바로 어떻게 표현되는지 살펴볼게요!

순서

  1. src > main > java > com.sparta.week02에 domain 이라는 패키지를 만듭니다.
  2. Course.java, CourseRepository.java( 인터페이스) 파일을 만듭니다.

Interface

  • JPA는 Repository를 통해서만 사용할 수 있습니다.
  • 인터페이스는 클래스에서 멤버가 빠진, 메소드 모음집이라고 보시면 됩니다.

Course.java (Table 만드는 java 코드) (1)

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 에러 설정

  • @Entity 클릭 후 → ALT + enter
  • 오토 임포트 사용 .
  • 남이 쓰던 코드를 자동으로 필요한 코드를 가져오게 가능.

    @Entity 에러 설정 후

@Id 오류도 위와 같이 동일

CourseRepository.java (인터페이스)

JPA 사용하기

SQL이 보이도록 application.properties 세팅

spring.jpa.show-sql=true

세팅 코드 삽입

JPA 실행

저장과 조회

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));
            }

        };

    }

}

intellij에서 확인 하기

웹콘솔 접속해서 확인

클래스를 만들고 저장하고 하나 하나 찍어보는것 숙달하는것이 중요 !!!!

생성일자 , 수정일자

상속(extends)의 개념

  • "extends" 라는 단어를 Repository에서 보았어요. 이게 대체 뭘까요?
  • "클래스의 상속"이라는 개념인데요. "이미 만들어둔거 가져다 쓰자!" 라고 선언하는 것입니다.

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() 메소드를 가지고 있습니다.
}

생성일자 , 수정일자 시작하기

Timestamped.java

추가 설명

Course.java

클래스에 extends Timestamped 추가.

Week02Application.java

@EnableJpaAuditing 추가

웹콘솔 접속해서 확인

JPA 심화

CRUD

CRUD란? 정보관리의 기본 기능

  • 생성 (Create)
  • 조회 (Read)
  • 변경 (Update)
  • 삭제 (Delete)

CRUD 데이터 저장하기 (Create) & 조회하기 (Read)

  • Repository의 save와 findAll 등을 이용합니다.

Week02Application.java

Course.java

id Getter 추가.

intellij에서 확인 하기

ID가 없을때


CRUD 변경하기 (Update)

  • Update 는 Service 부분에 작성합니다.

스프링의 구조는 3가지 영역

  1. Controller : 가장 바깥 부분, 요청/응답을 처리함.
    → 2주차 후반부에 배울 녀석
  2. Service : 중간 부분, 실제 중요한 작동이 많이 일어나는 부분
    → 지금 배울 녀석
  3. Repo : 가장 안쪽 부분, DB와 맞닿아 있음.
    → 여태 배운 녀석 (Repository, Entity)

Course.java

Update 메소드 추가.

service 패키지 생성 및 CourseService 클래스 생성

update 실행해보기

Week02Application.java

intellij에서 확인 하기

CRUD 삭제 (Delete)

Week02Application.java


Lombok, DTO

Lombok 소개

Lombok(이하 롬복)은, 자바 프로젝트를 진행하는데 거의 필수적으로 필요한 메소드/생성자 등을
자동생성해줌으로써 코드를 절약할 수 있도록 도와주는 라이브러리입니다.

Lombok 환경설정

  • Windows: Ctrl + Alt + S

  • shift 두번 눌러주기!
  • Actions → plugins 검색.
  • Marketplace lombok 다운.

Lombok으로 코드 줄이기

  • Course.java
    Course 클래스 Getter, NoArgsConstructor 적용
  • CourseService.java
    CourseService 클래스 RequiredArgsConstructor 적용

Course.java


@Getter 오너테이션 추가.

CourseService.java

@RequiredArgsConstructor 오너테이션 추가.

DTO

테이블을 막 건드려도 될까?
= read, update할 때 Course 클래스를 막 써도 될까?
= 내가 아닌 다른 사람이 변경이라도 한다면??
완충재로 활용하는 것이
DTO(Data Transfer Object)입니다.

DTO 만들기

CourseRequestDto.java

Week02Application.java

Course.java

intellij에서 확인 하기

API - GET

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

GET (데이터 조회)

CourseController.java

웹브라우저에서 확인 하기

브라우저에서 접근하는 방식은 get

get 방식으로 동작하는 API

ARC

현업에서 API를 만들고 나면 각종 툴로 테스트 및 기능 확인을 정말 많이 하는데요.
그 중에서도 유용한 툴인 ARC를 함께 사용해보도록 하겠습니다.

API 실제 동작 확인
두가지
1. 테스트코드 작성해서 확인
2. 툴을 사용해서 확인 (ARC 등등..)

ARC로 API get 확인 하기

POST (데이터 생성)

CourseController.java

Course.java

ARC로 API post 확인 하기


header 정보를 같이 보낸다
+ADD 클릭
headername → content-type = 데이터를 같이 보낼건데 데이터타입은 content-type이다.
application/json 왜 json형식으로 보내야되는 걸까? json형식이 대중적인 형태이다.

BODY 클릭!

생성된 POST 다시 GET으로 확인.

PUT (데이터 수정)

CourseController.java

ARC로 API PUT 확인 하기

http://localhost:8080/api/courses/1
/1 수정할 ID 번호

"id": 1,
"title": "웹개발의 봄, Spring",
"tutor": "임민영"
이 데이터를 

"title": "앱개발 종합반",
"tutor": "남병관" 이렇게 수정하겠다. 

생성된 POST 다시 GET으로 확인.

DELETE (데이터 삭제)

CourseController.java

profile
각성구

0개의 댓글