[인프런 워밍업 클럽 스터디 1기] 첫번째 발자국
1. 1주차 학습한 강의 내용
1일차(1강~5강)
1. 새로운 프로젝트 시작하기
Spring Initializr 사용하기
새로운 프로젝트를 시작할 때 사용하면 된다.
의존성 : 프로젝트에서 사용하는 라이브러리와 프레임워크를 의미한다.
라이브러리 : 프로그래밍을 개발할 때 미리 만들어져 있는 기능들을 가져와서 사용하는 것을 의미한다.
프레임워크 : 프로그래밍을 개발할 때 미리 만들어져 있는 구조에 코드를 가져와서 넣는 것을 의미한다.
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. 미션
나만의 어노테이션을 만들 수 있었다는 걸 알게 되었고, 어떠한 상황에서 정해진 어노테이션만 사용했었는데, 만드는 방법을 알게 되어 좋았다.
3번째 문제에서 배열로 처리했는데, 배열보다는 리스트로 하는 게 더 좋다는 피드백 댓글을 보고 리스트로 적용해서 구현해보고, 다른 방법들도 알게 되어 좋았다.
람다식에 대해 깊게 공부한 적은 없었는데, 이번 과제를 하면서 람다식에 대한 도입 배경, 방법 등을 알게 되어 좋았다.
3. 회고
일주일이 정말 금방 지나간 느낌이다. 과제를 하면서 스스로 고민해보고 구현하면서 성장할 수 있는 시간을 갖게 되어 좋았다. 다른 일도 겹치면서 아직 4,5일차 과제를 완료하지 못했지만 기간 안에 제출하도록 노력해야겠다. 헷갈리는 부분들을 복습하면서 다음주엔 더 분발해야겠다!
댓글을 작성해보세요.