[인프런 워밍업 클럽 BE]1-3일차 강의 정리

이 문서는

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지] 강의 - 인프런 (inflearn.com)

강의와 연관 스터디 내용을 정리하였습니다.

 

1-3일차 강의 정리

 

시작하며

작년 초, 학원에서 6개월 부트캠프(말이 부트캠프지 사실 매일 5시간의 정규 수업만 있었습니다...) 과정을 밟았지만 솔직히 말해서 기초 중에 기초만 겨우 깐 기분이었습니다. 그마저도 배운 스택이 최신 스택과는 거리가 멀었습니다. 그래서 9월부터 다시 인프런에서 스프링 강의를 들으며 처음부터 다시 시작해야겠다, 생각을 하고 공부를 시작했습니다. 하지만 시간이 지나며 점점 막막해지고 정신도 해이해지고 있었는데 이렇게 좋은 기회를 접하게 되었네요! 열심히 하는 분들을 보며 동기부여를 얻을 수 있을 것 같습니다!

 

사실 강의를 들으며 그 때 그 때 노션에서 정리 중이긴 하지만, 개인 페이지이기도 하고 깔끔하지 못해서 인프런 블로그에 한 번 더 정리하며 내용을 보강해볼 생각입니다. 글 재주가 없어 매일 작성은 어렵겠지만 적어도 3일에 한 번은 정리해 올리는 것을 목표로 삼고 있습니다. :)

강의는 최대한 간결하게 이론 위주로 정리하려고 합니다(코드들은 노션 개인 페이지에 비공개로 올리고 있습니다!). 추가적인 내용은 여러 블로그, w3school, mozilla, oracle 등의 공식 문서와 간혹 chatGPT를 참고했습니다.


2강.

1강은 주로 프로젝트 생성에 관한 이야기이기에 넘어간다.

 

기본적으로 스프링부트 프로젝트를 생성하면

src>main>java>com>{group name}>{…}>{…}Application 이란 파일이 있을 것이다.

image

클래스 바로 윗줄에 @SpringBootApplication이란 어노테이션이 자동으로 붙어있는 걸 확인할 수 있다.

  • @SpringBootApplication - 스프링을 실행할 때 필요한 다양한 작업과 설정을 자동으로 처리. 세 가지 기능을 수행한다.

    • @Configuration - 스프링 애플리케이션의 구성 소스임을 명시

    • @EnableAutoConfiguration - 스프링 부트 자동 구성 기능 활성화

    • @ComponentScan - @Component 관련 어노테이션을 찾아 자동 빈 스캔 및 주입

서버

  • 기능을 제공하는 '것'

  • 클라이언트로부터 요청을 받아 결과를 반환(응답)

  • 서버의 역할

    • DB 관리

    • 비즈니스 로직 처리

    • 인증

    • API 제공

    • 보안

    • etc

 


3강.

네트워크

 

강의에서 이세계의 택배시스템에 비유한 것을 정리한 표이다.

image

  • IP(Internet Protocol) - 컴퓨터 네트워크에서 장치 식별

    • IPv4 - 2011년에 모두 소진되어서 이제 할당되지 않는다. xxx.xxx.xxx.xxx

    • IPv6 - 오늘날에 대중화. 128비트로 구성.

  • 포트(port) - 컴퓨터 내에서 프로세스 식별.

  • DNS(Domain Name System) - IP주소를 외우는 것은 너무 불편하고 복잡해서 나온 시스템. naver.com, google.com 등...

     

     

    IP를 아파트 한 동, 포트를 각각의 호수로 생각해보아도 될 것 같다.

 


4강.

HTTP

네트워크가 택배 시스템이라면 HTTP는 운송장 양식과 비유할 수 있다.

운송장에 누구에게, 무엇을, 어디에 보내는지 적혀있는 것을 한 번쯤은 보았을 것이다. 이제 HTTP(HyperText Transfer Protocol)를 보자.

GET /item?option1=***&option2=… Host: spring.com:3000

  1. 요청하는 행위 - Get, Post, Put, Delete

  2. 요청받은 자원(path)과 세부 조건

  3. 요청을 받는 컴퓨터와 프로그램 정보

Query&Body

위에 있는 ?option1=***&option2=… 이 방식을 쿼리라고 한다.

option을 key, '=' 뒤의 ***이 value가 된다.

이 방식은 get, delete에서 사용된다.

put과 post같은 경우는 body 형식을 사용하는데 이는 더 뒤에서 확인해보자.

API(Application Programming Interface)

=>정해진 약속을 하여 특정 기능을 수행하는 것

GET /item?option1=***&option2=… Host: spring.com:3000

  1. 첫 번째 줄 - 메소드 path 쿼리

  2. 두 번째 줄 - 헤더(복수 줄 가능)

  3. 다음 한 줄은 비운 채로 띈다.

  4. body(복수 줄 가능)

URL(Uniform Resource Locator)

https://www.notion.so/1-0fdc9fb58da247f4a1ae44166dd7bf8a

현재 페이지의 url 주소를 보자.

http - 약속된 프로토콜

:// - 구분 기호

notion.so - 도메인 이름

그 다음은 path 경로가 나온다.

클라이언트 - 서버 구조

클라이언트 - 요청한 컴퓨터

서버 - 요청 받고 응답하는 컴퓨터

응답 구조 역시 요청과 동일하다.

  1. 첫 번째 줄 - 상태 코드

  2. 두 번째 줄 - 헤더(복수 줄 가능)

  3. 다음 한 줄은 비운 채로 띈다.

  4. 바디(복수 줄 가능)

상태 코드

서버 컴퓨터가 응답할 때 어떤 숫자를 보내는데, 이를 상태 코드라고 한다.

200 - ok

300 - moved permanently(요청한 리소스가 헤더에서 제공한 URL로 영구적 이동)

404 - not found

500 - internal server error

이 외에도 다양한 상태코드가 있다.


5강.

API 개발 전에 해야 하는 것

→ API specification(spec)

 

API 개발을 위한 어노테이션

@RequestMapping - 요청 방식에 관계없이 url이 일치하는 요청을 처리

@RestController - api 개발을 위해 사용하는 어노테이션. 일반적인 MVC 형식(model view controller)의 컨트롤러는 @Controller 를 사용한다.

@GetMapping - GET Method 매핑

@PostMapping- POST Method 매핑

@RequestParam

- 요청 파라미터 앞에 적는다. 기본적으로 required=true 이다. int나 String 같은 단순 타입은 생략이 가능

-파라미터 이름==변수 이름 => name속성 생략 가능(생략 시 required = false)

-필수 파라미터 누락 => 400 에러 / 기본형 누락 => 500 에러


6강.

Post API

GET에서는 query 형식으로 데이터를 받았지만,

POST에서는 데이터를 HTTP Body를 통해 받는다.

근데 body에 특별한 체계 없이 개발자가 원하는 대로 넣으면 큰 혼란이 발생할 것이다. 이런 문제를 단번에 해결하는 문법이 있다.

→JSON(JavaScript Object Notation) - 객체 표기법

  • “key”: value 형식 (Java Map이 떠오른다!)

  • 속성 간 구분은 쉼표로!

  • value는 배열도 들어갈 수 있다. []로 표기

  • JSON 안에 다른 JSON이 들어갈 수도 있다.


7-8강.

DTO(Data Transfer Object)

=데이터 전송 객체(java beans) => 프로세스 간 데이터를 전달하는 객체

DB에서 데이터 얻음 -> Service 혹은 Controller로 전송

VO(Value Object)

=한 개 혹은 그 이상의 속성을 갖는 특정 값을 나타내는 객체

Domain(Entity Class)

실제 DB 테이블과 매칭되는 클래스

DAO(Data Access Object)

실제 DB에 접근하는 객체 = 흔히 말하는 repository...

-service 계층과 db 사이의 계층

-db에 접근 => sql 사용

 

7-8강의 코드는 생략하고 자연스럽게 나온 DAO와 그 연관 개념에 대해 작성했다. 이전부터 DTO와 domain이 혼란스러웠는데, 개념을 잡고 가는 것이 좋을 것 같다. 아래 블로그에서 domain과 DTO의 분리 이유도 설명하고 있어 유용하다고 생각한다.

https://jihoon2723.tistory.com/entry/VO-DAODTO-Entity-Domain-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0


10강.

이전 강의까지는 서버를 종료하고 재실행할 때마다 저장한 정보가 전부 날아가는 문제가 존재 -> DB의 존재가 절실!

컴퓨터의 핵심 부품

우선 이전에 우리가 만든 데이터는 왜 날아갔을까?

  • CPU - 연산 장치

  • RAM - 임시 기억 장치

  • DISK - 장기 기억 장치

  1. 서버 자체는 DISK에 잠들어 있다.

  2. 서버 실행 시 코드 정보가 RAM으로 복사된다.

  3. API가 실행되면 연산이 수행되며 CPU와 RAM을 반복한다.

  4. POST API를 통해 생긴 유저 정보 역시 RAM에 있다!

  5. 서버가 종료되면 RAM에 있는 모든 정보가 휘발된다.

그렇다면 우리가 해야할 일은 우리가 저장한 내용을 DISK에 넣어야 한다! 이를 위해 사용하는 것이 Database(DB)이다.

Database

데이터를 구조화 시켜 저장

RDB

관계형 데이터베이스

데이터를 표처럼 구조화

SQL

구조화된 데이터를 조회하는 언어


11-13강.

11강부터는 본격적으로 sql문을 학습한다.

DB 생성

create database[db 이름];

DB 조회

show databases;

DB 삭제

drop database [db 이름];

DB 사용

use [db 이름];

Table 조회

show tables;

Table 생성

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

DB 조회

show databases;

필드 TYPE

  • tinyint - 1바이트 정수(byte)

  • smallint - 2바이트 정수

     

  • mediumint - 3바이트 정수

  • int - 4바이트 정수(int)

  • bigint - 8바이트(long)

  • double - 8바이트 정수

  • decimal(a,b) - 소수점 아래 자릿수가 b개인 전체 자릿수가 a개인 실수

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

  • varchar(n) - 길이가 n까지 허용되는 문자열

  • text - 사이즈가 큰 문자열

  • blob - 사이즈가 큰 문자열

  • date - 날짜

  • time - 시간

  • datetime - 날짜와 시간

  • timestamp - 형식은 datetime과 동일하나 time_zone에 의존

varchar(n) vs text vs blob의 정확한 차이가 무엇일까. 추가적인 조사나 디스코드에 질문을 남겨봐야겠다...

 

Table 필드 조회

describe fruit;
desc fruit;

Table 삭제

drop table [table 이름]

DDL

테이블 자체를 생성, 삭제, 변경, 초기화 하는 것을 DDL(Data Definition Language)이라 한다.

CRUD

CREATE - 넣기

READ - 조회

UPDATE - 수정

DELETE - 삭제

데이터 넣기

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

데이터 전체 조회

select * from [db 이름];
select [필드 이름1], [필드 이름2] from [db 이름];

조건을 넣은 데이터 조회

select * from [db 이름] where [조건];

데이터 업데이트

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

조건문을 작성하지 않으면 모든 데이터가 바뀌니 항상 주의하자!

데이터 삭제

delete from [table 이름] where [조건];

조건문을 작성하지 않으면 모든 데이터가 삭제되니 항상 주의하자!

DML

테이블 데이터를 조작하는 sql문을 DML(Data Manipulation Language)이라 한다.


후기

아직 3일차라, 회고록이라고 부르기엔 영 민망하지만 그래도 나름대로 느낀 점이 많았다.

이런 온라인 스터디에 참여해본 것은 처음인데, 저번 주의 자신보다는 열심히 하고 있구나 하고 체감이 된다는 것은 확실히 놀라운 일이었다. 사실 3월 초에 sqld 시험을 접수해놓은 상태라 두 가지를 제대로 병행할 수 있을까 걱정을 많이 했는데 다른 참여자 분들 중에서는 회사 생활 중이신데도 열심히 하시는 분들도 제법 보였다. 그걸 보고 아직 내 마음가짐이 어설프긴 했구나... 하는 약간의 반성을 하였다. 😂