[인프런 워밍업 클럽 스터디 1기] 첫번째 발자국

[인프런 워밍업 클럽 스터디 1기] 첫번째 발자국

1. 1주차 학습한 강의 내용

 

1일차(1강~5강)

1. 새로운 프로젝트 시작하기

Spring Initializr 사용하기

  • https://start.spring.io/

  • 새로운 프로젝트를 시작할 때 사용하면 된다.

  • 의존성 : 프로젝트에서 사용하는 라이브러리와 프레임워크를 의미한다.

  • 라이브러리 : 프로그래밍을 개발할 때 미리 만들어져 있는 기능들을 가져와서 사용하는 것을 의미한다.

  • 프레임워크 : 프로그래밍을 개발할 때 미리 만들어져 있는 구조에 코드를 가져와서 넣는 것을 의미한다.

2. @SpringBootApplication과 서버

@SpringBootApplication

package com.group.libraryapp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class LibraryAppApplication {

  public static void main(String[] args) {
    SpringApplication.run(LibraryAppApplication.class, args);
  }
}
  • @SpringBootApplication : 어노테이션, 스프링 부트를 자동으로 설정이 가능하다.

  • Class : 메인 메소드로 구성된다.

  • SpringApplication.run(LibraryAppApplication.class, args) : 실제 스프링 부트 애플리케이션을 시작한다는 의미를 가진 코드이다.

서버(Server)란?

  • 기능을 제공하는 것을 의미한다.

  • 어떠한 기능을 제공하는 프로그램을 의미한다.

  • 그 프로그램을 실행시키고 있는 컴퓨터를 의미한다.

3. 네트워크란 무엇인가?

  • IP : 컴퓨터의 주소를 의미한다.

  • Domain Name(도메인 네임) : 외우기 어려운 IP 대신 외우기 쉬운 이름으로 변환한 것을 의미한다.

    • DNS : IP 244.66.51.9 = 도메인 네임 spring.com, 이러한 체계를 의미한다.

  • port(포트) : 사용하는 프로그램 데이터를 받는다.

4. HTTP와 API란 무엇인가?

HTTP란?

  • 인터넷에서 데이터를 주고 받을 때 하는 표준, 약속을 의미한다.

예) 운송장 표준 - 요청하는 행위, 받는 사람, 항목(자원), 세부조건

  • 행위와 자원은 운송장을 보내기 전에 약속을 해야 한다.

HTTP 요청

GET 요청

GET /portion?color=red&count=2
Host: spring.com:3000
//의미 - 내놓아라 파란집 둘째, 포션 빨간색 2개
  • GET(HTTP Method) : 요청을 받는 컴퓨터에게 요청하는 행위(데이터 요청)

  • /portion(Path) : 받을 항목(자원)

  • ? : 구분기호

  • color=red : 자원의 세부조건(Query)

  • & : 구분기호

  • count=2 : 자원의 세부조건(Query)

  • Host: spring.com:3000 : HTTP 요청을 받는 컴퓨터와 프로그램 정보

POST 요청

POST/oak/leather
Host: spring.com:3000

오크가죽정보
//창고에 넣어라 빨간집, 오크가죽
  • POST : 요청을 받는 컴퓨터에게 요청하는 행위(데이터 저장)

  • /oak/leather : HTTP 요청을 받는 컴퓨터에게 원하는 자원

  • Host: spring.com:3000 : 어떤 컴퓨터에 어떤 데이터를 받을지 정보

  • 오크가죽정보 : 실제 저장할 오크 가죽 정보(데이터, Body)

데이터를 보내는 2가지의 방법

  • 쿼리 : GET에서 사용한다.

  • 바디 : POST에서 사용한다.

다양한 HTTP Method

  • GET : 데이터 요청, 쿼리 사용

  • POST : 데이터 저장, 바디 사용

  • PUT : 데이터 수정, 바디 사용

  • DELETE : 데이터 삭제, 쿼리 사용

API(Application Programming Inteface)란?

  • 정해진 약속을 통해 특정 기능을 수행하는 것을 의미한다.

HTTP 응답

  • 정보 처리해서 응답 보내기(200 OK) -> 200 OK : 정보가 잘 저장되었다는 의미이다.

  • 저장이라는 기능을 수행한다.

💡 요청에 대한 응답을 제공한 컴퓨터는 서버(Server)를 의미한다.

💡요청한 컴퓨터는 클라이언트(Client)를 의미한다.

상대 코드

  • 응답에 들어가는 숫자를 의미하며, 매우 다양하다.

  • 어떠한 상태인지 알려주는 코드이다.

상대 코드의 종류

  • 200 OK : 요청이 성공했다는 의미이다.

  • 300 Moved Permanently : 다른 곳으로 옮겨가라는 의미이다.

  • 404 NotFound : 요청한 내용을 찾을 수 없다라는 의미이다.

  • 500 Internal Server Error : 내부에 문제가 발생했다는 의미이다.

5. GET API 개발하고 테스트 하기

덧셈 API

  • HTTP Method -> GET

  • HTTP Path -> /add

  • 쿼리(key와 value) -> int number1 / int number2

  • API의 반환 결과 -> 숫자 - 두 숫자의 덧셈 결과

GET API 개발 데이터의 흐름

  • Postman에서 ?number1=100&number2=200(쿼리) 스프링 부트에서 보내면 값을 보고 객체로 만들어둔 Calculator, Add, Request에다가 값을 넣는다.

  • 그 객체를 Controller, API의 진입지점에 보내준다.

  • 정보를 전달하는 역할의 객체 : DTO(Data Transfer Object)

  • Postman에서 send를 하면, HTTP 요청 -> 스프링 부트 서버로 도착 -> API 진입지점을 거쳐 /Add 통과 후 DTO request 함수를 실행한다.

  • return -> 응답 생성 -> Postman에게 전달 -> Postman에서 결과를 보여준다.

 

2일차(6강~9강)

1. POST API 개발 및 테스트하기

POST API에서 데이터 받을 경우

  • HTTP Body 사용한다.

  • JSON으로 데이터를 받는다.

  • 사용되는 문법 -> JSON

JSON이란?

  • 객체 표기법을 의미하며, 무언가를 표현하기 위한 형식이다.

JSON 문법

  • {}중괄호를 사용한다.

  • {}중괄호 안에 "key":value로 표기한다.

  • 속성은 ,로 구분한다.

  • 추가적으로 다른 JSON 문법을 작성할 수 있다.

{
 "name":"김철수",
 "age":50
}

곱셈 API

  • HTTP Method -> POST

  • HTTP Path -> /multiply

  • HTTP Body(JSON) -> {"number1":숫자,"number2":숫자}

  • API의 반환 결과 -> 숫자(곱셈 결과)

POST API 개발 데이터 흐름

  • 데이터를 전달해주는 객체인 DTO 생성

  • POST API 개발

  • Body 사용 시 @RequestBody 어노테이션을 사용한다.

  • JSON을 CalculatorMultiplyRequest 객체로 전환해준다.

     

2. 유저 생성 API 개발 및 테스트하기

도서 관리 애플리케이션의 요구사항

  • 사용자

    • 도서관 사용자 등록(이름 필수, 나이 선택)

    • 도서관 사용자 목록 확인

    • 도서관 사용자 이름 수정

    • 도서관 사용자 삭제

    • 도서관 책 등록 및 삭제

    • 도서관 사용자 책 대여

      • 다른 사람이 대여 시 대여 불가능

    • 도서관 사용자 책 반납

도서관 사용자 등록하기

유저 생성 API 조건

  • HTTP Method : POST

  • HTTP Path : /user

  • HTTP Body (JSON)

JSON
{
  "name": String (null 불가능),
  "age":Integer
}
  • 결과 반환 X(HTTP 상태 200 OK이면 충분하다.)

유저 생성 API 개발 데이터 흐름

  • Body를 객체로 표현할 DTO 생성

  • 유저를 저장하기 위한 객체 생성

  • 유저 생성 API 개발

  • POST user 호출 -> 함수 실행 -> Body에 이름과 나이가 들어오면 객체로 매핑한다.

  • 새로운 유저를 만들 때 사용되는 Requset -> 생성된 유저 객체가 List에 저장 -> 함수가 예외없이 완료되면 응답코드 200 OK로 반환한다.

3. 유저 조회 API 개발 및 테스트하기

유저 조회 API 조건

  • HTTP Method : GET

  • HTTP Path : /user

  • 쿼리 : 없음

  • 결과 반환 (JSON)

JSON
{
  "name": String (null 불가능),
  "age":Integer
}

유저 조회 API 개발 데이터 흐름

  • 데이터를 담아 줄 DTO 생성

  • 유저 조회 API 개발

  • User List 생성 -> List에 들어있는 유저들이 1개씩 돌면서 UserResponse 형태로 반환한다.

  • 결과 리스트에 추가 -> responses로 반환한다.

 

3일차(10강~13강)

1. 컴퓨터의 핵심 부품 이해하기

서버 유저 정보가 왜 남아있지 않는지 이해하기 위해 알아보자.

  • CPU : 연산

  • RAM : 임시 기억장치

  • DISK : 장기 기억장치

2. Database와 MYSQL

Database란?

  • 데이터를 구조화시켜 저장하는 것을 의미한다.

  • RDB (Relational Database) - MySQL : 데이터를 표처럼 구조회 시켜 저장하는 것을 의미한다.

  • SQL(Structured Query Language) : 표처럼 구조화된 데이터를 조회하는 언어이다.

3. MySQL에서 Table 생성하기

데이터베이스 생성

create database [데이터베이스 이름];

데이터베이스 목록 확인

show databases;

데이터베이스 삭제

drop database [데이터베이스 이름];

데이터베이스 안으로 들어가기

use [데이터베이스 이름];

테이블 목록 확인

show tables;

테이블 생성

create table [테이블 이름] (
[필드1 이름] [타입] [부가조건],
[필드1 이름] [타입] [부가조건],
...
primary key([필드 이름])
);

테이블 생성 예시

create table fruit
(
    id           bigint auto_increment,
    name         varchar(20),
    price        int,
    stocked_date date,
    primary key (id)
);
  • auto_increment : 데이터가 없어도 1부터 1개씩 증가하며, 자동 기록된다.

  • primary key : 유일한 키를 의미하며, id라는 필드를 지정한다.

테이블 삭제

drop table [테이블 이름];

=> 해당 SQL를 DDL(Data Definition Language)이라고 정의한다.

MYSQL 타입의 종류

  • 정수 타입

    • tinyint : 1바이트

    • int : 4바이트

    • bigint : 8바이트

  • 실수 타입

    • double : 8바이트 정수

    • decimal(A, B) : 소수점을 B개 갖고 있는 전체 A자릿수 실수

  • 문자열 타입

    • char() : ()글자가 들어갈 수 있는 문자열

    • varchar() : 최대 ()글자가 들어갈 수 있는 문자열

  • 날짜, 시간 타입

    • date : 날짜, yyyy-MM-dd

    • time : 시간, HH:mm:ss

    • datetime : 날짜와 시간을 합친 타입, yyyy-MM-dd HH:mm:ss

4. Table 데이터 조작하기

생성, 조회, 수정, 삭제 방법(CRUD)

  • 생성 : Create

  • 읽기 : Read

  • 수정 : Update

  • 삭제 : Delete

데이터 삽입

insert into [테이블 이름](필드1 이름, 필드2 이름) values (값1, 값2, ...)

데이터 삽입 예시

insert into fruit (name, price, stocked_date) values ('사과', 1000, '2023-01-01');
  • ()안의 필드와 값의 순서가 중요하기 때문에 순서대로 작성해야 한다.

  • id는 지정하지 않아도 auto_increment가 자동으로 생성해준다.

데이터 조회

select * from [테이블 이름];
select * from [테이블 이름] where [조건];

데이터 조회 예시

select name, price from fruit;

select *
from fruit where name = '사과' and price <= 2000;
  • 테이블명 대신 필드 이름도 가능하며, 여러개를 넣을 수도 있다.

  • 조건을 넣어서 조회도 가능하다. (and, or, =,>=,<=, !=, between, in, not 등이 있다.)

데이터 수정

update [테이블 이름] set 필드1이름=값, 필드2이름=값, ... where [조건];

데이터 수정 예시

update fruit set price = 1500 where name = '사과';
  • 조건을 붙이지 않으면 모든 데이터가 업데이트 되기 때문에 주의 해야 한다.

데이터 삭제

delete from [테이블 이름] where [조건];

데이터 삭제 예시

delete
from fruit
where name = '사과';
  • 조건을 붙이지 않으면 모든 데이터가 삭제 되기 때문에 주의 해야 한다.

=> 해당 SQL를 DML(Data Manipulation Language)이라고 정의한다.

5. Spring에서 Database 사용하기

Database 설정 파일 추가

  • application.yml 파일 생성

spring:
  datasource:
    url: "jdbc:mysql://localhost/library"
    username: "root"
    password: ""
    driver-class-name: com.mysql.cj.jdbc.Driver
  • url: jdbc:mysql://Host/접근DB명

  • username: MySQL에 접근하기 위한 계정명

  • password: MySQL에 접근하기 위한 비밀번호

  • driver-class-name: DB에 접근 시 사용할 프로그램

 

4일차(14강~16강)

1. 사용자 수정 API, 삭제 API 개발 및 테스트하기

사용자 수정 API 조건

  • HTTP Method : PUT

  • HTTP Path : /user

  • HTTP Body (JSON)

{
  "id": Long,
  "name": String
}
  • 결과 반환 X (HTTP 상태 200 OK이면 충분하다.)

사용자 삭제 API 조건

  • HTTP Method : DELETE

  • HTTP Path : /user

  • Query 사용

    • 문자열 name (삭제되어야 하는 사용자 이름)

  • 결과 반환 X (HTTP 상태 200 OK이면 충분하다.)

사용자 수정 및 삭제 API 개발

  • 사용자를 수정하기 위한 DTO 추가

  • 사용자 수정/삭제 API 개발

사용자 수정 API, 삭제 API 예외처리 하기

  • 존재하지 않는 사용자를 수정하거나 삭제하려고 해도 응답코드 200 OK가 나온다.> 예외처리해야 한다.

  • 데이터 존재 여부를 확인하고 예외처리 하기

사용자 수정/삭제 API 예외처리 개발

  • id를 기준으로 사용자가 존재하는지 확인하기 위해 SELECT 쿼리 작성한다.

  • SQL을 DB에 전송해서 데이터가 있는지 확인한다.

  • SELECT SQL의 결과가 있으면 0 반환, ? 값 id를 삽입한다.

  • 0은 최종적으로 List로 반환한다.

     

  • 사용자가 존재하지 않을 경우 예외처리한다.

사용자가 존재하지 않을 경우

  • 예외처리한 결과, 내부에 문제가 있다는 오류가 발생했다.

 

5일차(17강~18강)

1. 좋은 코드(Clean Code)가 왜 중요한가?

  • 코드는 요구사항을 표현하는 언어이다.

     

  • 좋은 코드는 코드만 보고도 의미를 파악을 할 수 있다.

  • 안 좋은 코드가 쌓이면, 시간이 지날수록 생산성이 낮아진다.

Clean Code

  • 함수는 최대한 작게 만들고, 1가지 일만 수행하는 것이 좋다.

  • 클래스는 작아야 하며, 하나의 책임만을 가져야 한다.

2. Controller, Service, Repository 분리하기

Controller의 함수 1개가 하고 있던 역할

  • API의 진입 지점으로서 HTTP Body를 객체로 변환한다 -> Controller

  • 현재 유저가 있는지 없는지 등을 확인하고 예외처리를 해준다. -> Service

  • SQL을 사용해 실제 DB와의 통신을 담당한다. -> Repository

역할 분리 구조

  • Controller : API와 HTTP 관련 역할 담당

  • Service : 분기 처리 및 로직 담당

  • Repository : DB와의 접근을 담당

  • 각 역할을 분리하여 수행하는 계층으로 이루어진 구조를 계층화 아키텍쳐(Layered Architecture)라고 한다.

  • JdbcTemplate 변수를 선언하고 생성자를 통해 UserRepository를 인스턴스화하는 시점에 JdbcTemplate을 넣어주도록 변경한다.


2. 미션

첫 번째 과제(1일차)

  • 나만의 어노테이션을 만들 수 있었다는 걸 알게 되었고, 어떠한 상황에서 정해진 어노테이션만 사용했었는데, 만드는 방법을 알게 되어 좋았다.

두 번째 과제(2일차)

  • 3번째 문제에서 배열로 처리했는데, 배열보다는 리스트로 하는 게 더 좋다는 피드백 댓글을 보고 리스트로 적용해서 구현해보고, 다른 방법들도 알게 되어 좋았다.

세 번째 과제(3일차)

  • 람다식에 대해 깊게 공부한 적은 없었는데, 이번 과제를 하면서 람다식에 대한 도입 배경, 방법 등을 알게 되어 좋았다.


3. 회고

  • 일주일이 정말 금방 지나간 느낌이다. 과제를 하면서 스스로 고민해보고 구현하면서 성장할 수 있는 시간을 갖게 되어 좋았다. 다른 일도 겹치면서 아직 4,5일차 과제를 완료하지 못했지만 기간 안에 제출하도록 노력해야겠다. 헷갈리는 부분들을 복습하면서 다음주엔 더 분발해야겠다!

댓글을 작성해보세요.