A Developing Developer

[스파르타코딩클럽] 웹개발의 봄, Spring - 2주차 본문

웹개발의 봄, Spring 81기

[스파르타코딩클럽] 웹개발의 봄, Spring - 2주차

H-JJOO 2022. 9. 18. 15:42

[수업 목표]

1. RDBMS의 기초 지식을 습득한다.

2. Spring Data JPA의 사용법을 습득한다.

3. REST API를 만드는 방법을 익힌다.

 

01. [2주차] 이번 주 배울 것

 

[요약]

 

- RDBMS, 줄여서 RDB는 관계형 데이터베이스를 말합니다. 정보 저장소라고 생각하셔도 무방한데요.

- 쇼핑몰이라면 주문 정보, 고객 정보 등을 컴퓨터에 저장해야 할텐데, 이걸 도와주는 녀석입니다.

- H2는 RDBMS의 한 종류로, 서버가 켜져있는 동안에만 작동하는 RDB입니다.

- SQL은 데이터를 읽고, 저장하고, 변경하고, 삭제하는 구체적인 문법입니다.

 

- JPA(Spring Data JPA)는 스프링을 위해 태어난 녀석인데요.

- Java로 코드를 작성하면 S-QL로 번역해줄 뿐만 아니라, 기본적인 기능이 거의 완벽하게 들어있습니다.

- Repository는 JPA를 작동시키는 매개체입니다.

 

 

- API 요청에도 다양한 방식이 있습니다. 생성, 조회, 수정, 삭제 각각에 맞는 방법을 알아봅니다.

- 스프링은 데이터를 주고받는 방법을 강제합니다. 어떻게 하면 올바르게 주고받을 수 있는지 배웁니다.

- 현업에서는 데이터를 주고받을 때, DTO를 반드시 이용합니다. 왜 그러한지 이유와 방법을 배웁니다.

- 코드를 절약할 수 있는 Lombok 사용법을 익힙니다.

 

 

- 프로젝트 준비하기

1. 인텔리제이를 실행합니다.

2. New Project를 클릭합니다.

3. 왼쪽 메뉴에서 "Spring Initializr"를 클릭하고 "Next"를 클릭합니다.

4.꼭 다음 사항을 확인해주세요. Group: com.sparta Artifact: week02 Type: Gradle Language: Java  6 Java Version: 8 특히 Type, Language, Java version 중 하나라도 다르면 정상적으로 실행이 되지 않습니다. 꼭 정상입력 확인해주세요!

5. 검색창을 클릭하고, 다음을 차례대로 검색한 뒤 엔터를 눌러주세요. 검색이 끝난 뒤 아래 캡처의 우측과 같 이 5개의 요소가 포함되어있으면 완료된 것입니다.

- Lombok

- Spring Web

- Spring Data JPA

- H2 Database

- MySQL Driver

6. Finish를 클릭합니다.

7. 잠시 기다리면, 아래 화면이 완성될 것입니다. 축하합니다! 스프링 개발을 시작할 준비가 되었습니다.

 

02. [2주차] RDBMS

 

- RDBMS

 

- RDBMS란? RDBMS(Relational DataBase Management System)은 컴퓨터에 정보를 저장하고 관리하는 기술 입니다.

- 성능/관리 면에서 매우 고도화된 엑셀 이라고 생각하셔도 좋습니다.

 

- RDBMS의 종류

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

 

- MySQL

- PostgreSQL

- Oracle Database

 

- 우리가 사용할 RDBMS

-H2

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

- MySQL

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

 

- H2 웹콘솔 띄워보기

우리가 처음 프로젝트 시작할 때 H2 추가했던 것 기억하실까요?  바로 사용해보도록 하겠습니다!

1. src > main > resources > application.properties 파일을 열어주세요.

2. [코드스니펫] H2 웹콘솔 설정 을 복사해주세요.

 

spring.h2.console.enabled=true

spring.datasource.url=jdbc:h2:mem:testdb

 

3. Week02Application.java 파일을 Run 해주세요.

4. http://localhost:8080/h2-console 로 접속하시면 아래와 같은 화면이 뜹니다. Connect 버튼을 클릭해주세요.

 

5. 다음과 같은 화면이 뜨면 웹콘솔 띄우기에 성공입니다.

 

 

03. [2주차] SQL 연습하기

 

- SQL 연습하기

- H2 웹콘솔 사용해보기

- 기본 개념 

데이터베이스는 매우 고도화된 엑셀이다 - 라고 설명드렸던 것, 기억하실까요?

 

엑셀 파일 하나가 "데이터베이스"라면,

엑셀 시트 하나는 "테이블"이라고 부르고,

엑셀 행 하나는 "데이터"라고 부릅니다.

 

- 따라서 지금부터 우리가 할 것은

1. 테이블을 생성하고

2. 테이블에 데이터를 삽입하고

3. 삽입된 데이터를 조회해보는 것입니다.

 

테이블 생성하기 이름이 courses 인 엑셀 시트 하나 만드는 것과 같습니다!

수많은 행을 삽입할 수 있겠죠?

 

[코드스니펫] 테이블 courses 생성하기

 

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)

);

 

- 데이터 삽입하기

행 2개를 바로 삽입해보겠습니다.

 

[코드스니펫] courses 데이터 삽입

 

INSERT INTO courses (title, tutor) VALUES

    ('웹개발의 봄, Spring', '남병관'), ('웹개발 종합반', '이범규');

 

- 데이터 조회하기 

삽입한 데이터들을 조회해보겠습니다.

 

[코드스니펫] courses 조회하기

 

SELECT * FROM courses;

 

- 잠깐, 이게 뭐죠?

위에서 사용한 생성, 삽입, 조회 명령문을 SQL(Structured Query Language)이라고 합니다.

그럼, 웹서비스를 만들기 위해 SQL을 모두 배워야할까요? 아닙니다! 

 

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

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

어때요? 벌써 JPA 배울 생각에 두근거리는 심장 소리가 들리세요?

 

04. [2주차] JPA 시작하기

 

- JPA

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

JPA가 없다면?

https://www.baeldung.com/spring-jdbc-jdbctemplate

 

Spring JDBC Tutorial | Baeldung

Introduction to the Spring JDBC abstraction, with example on how to use the JbdcTempalte and NamedParameterJdbcTemplate APIs.

www.baeldung.com

자바 짜다가 갑자기 SQL 짜고, 그걸 잘 맞추어 넣어야 합니다. 복잡하네요 

 

JPA가 있다면?

https://spring.io/guides/gs/accessing-data-jpa/

 

Accessing Data with JPA

this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring team

spring.io

설정은 아래 한 줄이면 끝나고요

 

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

 

명령도 그냥 자바로 만들면 됩니다. 와우, 멋지네요 

 

- JPA 시작하기

 

프로젝트 시작할 때 JPA 선택했던 것 기억하시죠? 그 덕분에 우리는 따로 설정할 필요도 없이 바로 JPA를 사용할 수 있답니다. 바로 사용해보시죠!

 

 

- 자바로 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 파일을 만듭니다.

3. [코드스니펫] Course.java 클래스

 

4. [코드스니펫] CourseRepository.java 인터페이스

 

- Interface 란?

- JPA는 Repository를 통해서만 사용할 수 있습니다.

- 인터페이스는 클래스에서 멤버가 빠진, 메소드 모음집이라고 보시면 됩니다.

 

05. [2주차] JPA 사용해보기

 

[코드스니펫] SQL이 보이도록 application.properties 세팅

 

spring.jpa.show-sql=true

 

- JPA 사용해보기

[코드스니펫] JPA 실행 코드

// Week02Application.java 의 main 함수 아래에 붙여주세요.

@Bean

public CommandLineRunner demo(CourseRepository repository) {

    return (args) -> {

    };

}

 

[코드스니펫] 웹콘솔 접속해서 확인해보기

 

SELECT * FROM course;

 

 위 코드는 낯선 개념이 갑자기 많이 나옵니다. 하지만 겁먹지 말기! 왜나하면요.. 우리 수업에서 이번만 쓰고 다시는 안 쓰는 코드에요.

 

@Bean, 익명 함수 등은 실무에서 중요한 것들이 맞습니다.

하지만 중요한 건 지금 단계에서 필요한게 아니라는 거에요.

여기서 전부 이해하자고 하면, 그리고 앞으로 모르는게 나올 때마다 100% 알고 넘어가려고 하면 스프링은 그 양이 너무나 방대해서 법전 같은 책 두 권은 족히 떼야 할 거에요.

 

그렇게 개발을 익히면 너무 오래 걸립니다. 지쳐요. 만드는 재미를 잊어버립니다.

 

자전거 무게 중심 이론을 몰라도 자전거는 탈 수 있잖아요? 유체역학 몰라도 출퇴근길 자전거 타는데는 무리 없거든요. 우선 네 발 자전거에서 두 발 자전거로 넘어가고, 정말 나중에 프로 사이클 선수가 되었을 때 공기역학과 무게중심에 대해 알아보자구요.

 

06. [2주차] 생성일자, 수정일자

 

- 상속의 개념

- "extends" 라는 단어를 Repository에서 보았어요. 이게 대체 뭘까요?

- "클래스의 상속"이라는 개념인데요. "이미 만들어둔거 가져다 쓰자!" 라고 선언하는 것입니다.

- Tutor extends Person 과 같이 쓸 수 있습니다. 좀 더 살펴볼까요?

 

class Person {

    private String name;

    private String getName() {

         return this.name;

    }

}

 

class Tutor extends Person {

    private String address;

    // Person 클래스를 상속했기 때문에,

    // name 멤버변수와 getName() 메소드를 가지고 있습니다.

}

 

- 상속 연습해보기 - Timestamped

-  DB 기본 중의 기본은, "생성일자"와 "수정일자"를 필드로 가지는 것입니다.

- Course 클래스가 course 테이블이 되는 것, 살펴보셨죠?

- Course 클래스에 생성일자/수정일자 멤버를 추가해보겠습니다.

 

[코드스니펫] Timestamped.java

 

@MappedSuperclass // 상속했을 때, 컬럼으로 인식하게 합니다.

@EntityListeners(AuditingEntityListener.class) // 생성/수정 시간을 자동으로 반영하도록 설정

public class Timestamped {

 

    @CreatedDate // 생성일자임을 나타냅니다.

    private LocalDateTime createdAt;

 

    @LastModifiedDate // 마지막 수정일자임을 나타냅니다.

    private LocalDateTime modifiedAt;

}

 

- Course 클래스에 아래와 같이 붉은색 글자를 추가합니다.

 

class Course extends Timestamped {

 

- Week02Application 클래스에 다음과 같이 붉은색 글자를 추가합니다.

 

@EnableJpaAuditing

@SpringBootApplication

public class Week02Application {

 

- http://localhost:8080/h2-console 접속해서 확인해보기

1. Week02Application 재시작!

2. course 조회

 

SELECT * FROM course;

 

 

07. [2주차] JPA 심화 CRUD

 

- CRUD란?

정보관리의 기본 기능

→ 생성 (Create)

→ 조회 (Read)

→ 변경 (Update)

→ 삭제 (Delete)

JPA로 위의 기능을 하는 방법을 익혀보겠습니다.

 

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

 

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

 

[코드스니펫] create & read 해보기

- Service 의 개념

update, delete 로 넘어가기 전에, 다루어야 하는 개념이 바로 Service 입니다.

 

- 스프링의 구조는 3가지 영역으로 나눌 수 있습니다.

1. Controller : 가장 바깥 부분, 요청/응답을 처리함.

→ 2주차 후반부에 배울 녀석

2. Service : 중간 부분, 실제 중요한 작동이 많이 일어나는 부분

→ 지금 배울 녀석

3. Repo : 가장 안쪽 부분, DB와 맞닿아 있음.

→ 여태 배운 녀석 (Repository, Entity)

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

 

- Service 만들기

 

1. [코드스니펫] Course 클래스에 update 메소드 추가

 

public void update(Course course) {

    this.title = course.title;

    this.tutor = course.tutor;

}

 

2. src > main > java > com.sparta.week02 > service 패키지 생성

3. CourseService.java 만들기

4. [코드스니펫] CourseService.java

 

@Service // 스프링에게 이 클래스는 서비스임을 명시

public class CourseService {

    // final: 서비스에게 꼭 필요한 녀석임을 명시

    private final CourseRepository courseRepository;

 

    // 생성자를 통해, Service 클래스를 만들 때 꼭 Repository를 넣어주도록

    // 스프링에게 알려줌

    public CourseService(CourseRepository courseRepository) {

        this.courseRepository = courseRepository;

    }

    @Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌

    public Long update(Long id, Course course) {

        Course course1 = courseRepository.findById(id).orElseThrow(

            () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")

        );

        course1.update(course);

        return course1.getId();

    }

 }

 

- 데이터 변경하기 (Update)

 

[코드스니펫] update 실행해보기

 

- 데이터 삭제하기 (Delete)

 

[코드스니펫] delete 해보기

 

 

08. [2주차] Lombok, DTO

 

- Lombok 소개

코드 절약하기!

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

 

- 설치

1. 환경설정 Windows: Ctrl + Alt + S macOS: command + 

2. 검색창에 "Annotation Processors" 입력 후, 우측 "Enable ~" 체크하고 OK 클릭

3. Shift 두 번 누르고 plugins 입력 후 엔터

4. lombok 입력 후 아래처럼 생긴 아이콘의 우측 Install 버튼 클릭 → 인텔리제이 재시작

5. 다시 Shift 두 번 누르고 plugins 입력 후 엔터

6. lombok 검색했을 때 installed 상태라면 설치 완료

 

- 사용

- Course.java

- Course 클래스 Getter, NoArgsConstructor 적용

- CourseService.java

- CourseService 클래스 RequiredArgsConstructor 적용

 

- DTO 

테이블을 막 건드려도 될까?

= read, update할 때 Course 클래스를 막 써도 될까?

= 내가 아닌 다른 사람이 변경이라도 한다면?? 

 

완충재로 활용하는 것이 DTO(Data Transfer Object)입니다.

 

- 생성하기

1. src > main > java > com.sparta.week02 > models 에 CourseRequestDto 파일 생성

2. [코드스니펫] CourseRequestDto.java

- 적용하기

[코드스니펫] CourseService 변경하기

[코드스니펫] Course 변경하기

[코드스니펫] Week02Application 변경하기

 

@EnableJpaAuditing

@SpringBootApplication

09. [2주차] 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

데이터 조회 API부터 만들어보도록 하겠습니다.

1. src > main > java > com.sparta.week02 아래에 controller 패키지를 만듭니다.

2. CourseController.java 파일을 생성합니다.

3. [코드스니펫] CourseController.java

4. [코드스니펫] Week02Appplication.java

5. http://localhost:8080/api/courses 접속하여 다음 화면 확인

- ARC(Advanced REST Client) 소개

현업에서 API를 만들고 나면 각종 툴로 테스트 및 기능 확인을 정말 많이 하는데요.

그 중에서도 유용한 툴인 ARC를 함께 사용해보도록 하겠습니다.

1. 사전과제에서 설치한 ARC를 실행합니다.

2. Method 는 GET, Request URL에는 http://localhost:8080/api/courses 를 입력합니다.

3. 결과 화면을 확인합니다.

 

10. [2주차] API - POST, PUT, DELETE

 

- Pos

Post 는 생성 요청 입니다.

 

[코드스니펫] CourseController > POST

[코드스니펫] Course 클래스 생성자 추가

 

10초 복습

 

- 작동 확인

1. 스프링을 재시작합니다.

2. ARC를 켜고, 다음과 같이 입력합니다.

Method: POST URL: http://localhost:8080/api/courses

3. 하단 Headers를 클릭하고, name과 value를 각각 아래처럼 입력합니다.

-Content-Type

- application/json

4. BODY 탭을 클릭하고, 아래와 같이 입력합니다.\

 

{

    "title": "앱개발 종합반",

    "tutor": "김건희"

}

 

5. SEND 버튼을 누르고, 결과를 확인합니다.

 

- Put

[코드스니펫] CourseController > PUT

@PutMapping("/api/courses/{id}")

public Long updateCourse(@PathVariable Long id, @RequestBody CourseRequestDto requestDto) {

    return courseService.update(id, requestDto);

}

 

- 작동 확인

1. 스프링을 재시작합니다.

2. ARC를 켜고, 다음과 같이 입력합니다.

Method: PUT

URL: http://localhost:8080/api/courses/1

3. 하단 Headers를 클릭하고, name과 value를 각각 아래처럼 입력합니다.

- Content-Type

- application/json 

4. BODY 탭을 클릭하고, 아래와 같이 입력합니다.

 

{

    "title": "앱개발 종합반",

    "tutor": "남병관"

}

 

5. SEND 버튼을 누르고, 결과를 확인합니다.

 

11. [2주차] 끝 & 숙제설명

 

잠깐 복습

 

- 오른쪽에서 왼쪽으로, 그러니까 안쪽에서 바깥쪽으로 나오면서 전체 한 흐름을 배워봤습니다.

- RDBMS란 무엇인지, 대표적인 제품과 작동 명령어인 SQL에 대해 배웠습니다.

- 자바 명령어를 SQL로 번역하고 기본적인 메소드를 제공하는 JPA에 대해 배웠습니다.

- Controller, Service, Repository 계층 개념을 배웠습니다. 계층 간 소통을 위한 DTO를 사용하였습니다.

- 코드를 절약하는 Lombok 을 사용해보았습니다.

- REST API 개념에 대해서 배우고, CRUD 각각에 해당하는 POST, GET, PUT, DELETE API를 직접 구축 해보았습니다

 

=================================================================================

출처 : [스파르타코딩클럽] 웹개발의 봄, Spring(강의자료)

=================================================================================

 

2주차 개발일지 또한 1주차와 같이 진행해보았다.

어쩌다보니 Spring 강의를 3명의 강사, 튜터 접해보았는데, 각자의 스타일과 개발방식이 있는것 같다.

개인적으로 앞서 배운 두번의 강의가 도움이되어서 3번째 튜터님의 설명이 뭔가 어렵지 않게느껴진다.

[]

하지만 여전히 누군가에게 설명할 수준까지는 미치지는 못하는것같고 5주간의 커리큘럼이 끝난 후에도 계속해서 공부해야겠다. 

 

개인적으로 시간이 촉박해서 이정도로 마무리해야겠다.