본문 바로가기
기록, 회고/InFlearn Warming-up 0기 BE

[1일 차] - 내용 정리, 개인 회고

by TwoJun 2024. 2. 18.

인프런에서 주최하는 Warming-up 클럽 0기 백엔드 스터디에 참여하고 있다.

 

스터디에 참여하면서 배우게 된 내용을 전체적으로 정리하고, 참여하면서 느낀 부분을 회고해 보고자 한다.

 

(1) 1일 차 : 2024-02-19(Mon)

 

 

1. start.spring.io 

1-1. Project 

(1) Gradle, Maven 중 프로젝트에서 사용될 빌드 도구를 선택한다.

 

 

 

1-2. Language

(2) Java, Kotlin, Groovy 중 프로젝트에서 사용될 언어를 선택한다. 

 

 

 

1-3. Spring Boot

(1) 프로젝트의 스프링 부트 버전을 선택할 수 있다.

(2) SNAPSHOP, RC1 등의 경우 현재 개발 중이거나 오픈 베타인 버전을 의미

(3) 별도 표기가 없는 경우 안정화된 릴리즈 버전을 의미

 

 

 

1-4. Project Metadata

(1) Group

- 프로젝트의 그룹

 

(2) Artifact

- 프로젝트 최종 결과물의 이름 

 

(3) Name

- 프로젝트의 이름

 

(4) Desription

- 프로젝트에 대한 부가적인 설명

 

(5) Package name 

- 패키지 이름

 

(6) Packaging

- Jar, War 중 선택

 

(7) Java

- Java 언어의 버전 선택

 

 

 

1-5. Dependencies

(1) 프로젝트 설정 시 의존성이란, 프로젝트에서 사용하게 되는 라이브러리나 외부 프레임워크이며, 프로젝트가 컴파일되고 실행되기 위해 필요한 외부적인 자원을 명시하는 것을 말한다.

 

(2) 해당 영역에서 프로젝트에 필요한 의존성들을 추가해서 프로젝트를 구성할 수 있게 된다.

 

 

 

 

 

 

2. @SpringBootApplication & Server

2-1. @SpringBootApplication

(1) 스프링 부트 애플리케이션의 주요 요소 중 하나로써 스프링 애플리케이션을 시작할 때 필요한 모든 구성을 자동으로 수행하고 애플리케이션을 실행하기 위한 설정들을 포함하는 역할을 수행하는 자바 어노테이션 중 하나이다.

 

(2) 해당 어노테이션이 붙게 되면 스프링 부트 애플리케이션이 실행될 때 자동 구성 기능을 통해 클래스 패스, 스프링 빈 등록, 컴포넌트 스캔 등 주요 역할들을 자동화해 준다.

 

 

 

2-2. 서버란 무엇일까?

(1) 서버는 엄밀히 말하면 외부 클라이언트로 요청을 받아서 요청에 대한 처리를 수행하고 요청에 맞는 적합한 데이터를 제공하는 컴퓨터 시스템이나 프로그램 자체를 의미한다.

 

(2) 단어 의미 그대로 "어떠한 기능을 제공하는 것, 어떠한 기능을 제공하는 프로그램이나 컴퓨터"로 볼 수 있다. 

 

 

 

 

 

3. 네트워크(Network)

(1) 서버에게 요청을 보내려면 보내는 주체가 있어야 한다. 웹 애플리케이션의 경우 보내는 주체가 바로 인터넷이다. 인터넷은 네트워크를 기반으로 정보를 주고받게 되는데 네트워크란 무엇일까?

 

 

3-1. 네트워크

(1) 네트워크는 컴퓨터나 기타 장치들이 서로 통신(데이터 주고받기)할 수 있도록 각 디바이스들이 서로 연결된 구조를 의미한다. 이러한 네트워크에서는 데이터를 주고받기 위한 경로와 규칙(프로토콜)이 정의되어 있다.

 

 

 

3-2. IP(Internet Protocol) 주소 , Port

(1) IP : 각 컴퓨터를 고유하게 표현해줄 수 있는 고유 체계

 

(2) Port : 컴퓨터에서 네트워크를 통해 실행되고 있는 서비스나 애플리케이션의 특정한 통신을 위해 열려있는 통로(엔드 포인트)

 

 

 

3-3. DNS(Domain Name Service)

(1) 도메인 네임은 인터넷 네트워크를 통해 연결되어 있는 각 장치를 식별하는 데 사용되는 고유 문자열 체계를 의미한다.

 

(2) 각 장치의 고유 번호를 모두 기억하고 있어야 한다면 아무래도 다 기억하기는 어려울 것이다. 따라서 도메인 네임은 사람이 기억하기 쉽게 문자열 체계로 이루어져 있고 이러한 도메인 네임은 IP 주소와 1:1로 매칭되어 있다.

 

 

 

 

 

4. HTTP(HyperText Transfer Protocol) & API(Application Programming Interface)

4-1. HTTP

(1) HTTP은 일종의 프로토콜(규약, 약속)이다. 인터넷과 같은 웹 서비스상에서 각 컴퓨터가 데이터를 주고받기 위한 통신 규약이며 요청을 보내는 클라이언트와 요청에 대한 응답을 반환하는 서버 간의 통신을 위한 목적으로 설계되어 있다.

 

 

 

 

4-2. HTTP Request Message의 간략한 형태 

GET / Portion?color=2&count=2   [ Request line(응답의 경우 Status line) ]

~~~[ Header ] ~~~

 

~~~ [ Request Body ] ~~~

 

 

POST / Oak/leather  [ Request line(응답의 경우 Status line) ]

~~~[ Header ] ~~~

 

~~~ [ Request Body ] ~~~

 

 

(1) 쿼리 파라미터 (Query parameter)

- HTTP 요청 시 원하는 정보를 명시하기 위한 영역으로 볼 수 있다.

 

(2) 요청 시 처리(저장 또는 삭제)를 원하는 데이터가 있다면, Body 영역에 명시하여 요청을 보낼 수 있다.

 

(3) 쿼리 파라미터, Request Body 모두 요청에 대한 정보를 보내는 2가지 방법이라고 볼 수 있다. 

 

 

 

4-3. HTTP Method

(1) HTTP 메서드는 클라이언트가 서버에게 요청을 보낼 때 어떤 동작을 수행할지 지정하는 방식을 의미한다. 대표적으로 많이 사용되는 메서드들은 아래와 같다.

 

(2) GET

- 서버 리소스의 정보를 요청할 때 사용된다. Request Body에 데이터를 가지지 않고, 쿼리 파라미터를 URL에 기재하여 요청을 보낼 수 있다.

 

(3) POST

- 서버에 새로운 데이터를 저장하는 요청에서 사용된다. Request Body에 데이터가 포함될 수 있다.

 

(4) PUT

- 서버의 리소스를 수정할 때 사용된다. 데이터가 없다면 데이터가 새롭게 생성된다. Request Body에 데이터를 포함해야 한다.

 

(5) DELETE

- 서버의 리소스를 삭제할 때 사용된다. Request Body에 데이터를 가지지 않고 쿼리 파라미터를 URL에 기재하여 요청을 보낼 수 있다. 

 

 

 

 

4-4. URL(Uniform Resource Locator)

(1) URL이란 인터넷 상에서 서버가 보유한 자원의 위치를 나타내는 주소 체계를 의미한다.

 

(2) 이를 통해 특정한 자원의 위치를 명시하고 해당 자원에 접근하기 위한 프로토콜, 호스트, 포트, 쿼리 파라미터 등의 정보를 포함하고 있다.

 

URL의 구조

(3) http : 프로토콜

- 통신 규약을 위한 프로토콜을 기재

 

(4) spring.com : 호스트명(도메인명)

- 자원이 위치한 서버의 도메인이나 IP 주소

 

(5) :3000 (포트 번호)

- 자원에 접근할 때 사용되는 포트 번호를 기재

 

(6) /portion (경로)

- 서버 상에 존재하는 자원의 위치

 

(7) ?color=red&count=2 (쿼리 파라미터)

- 요청 시 서버에 전달되는 추가 파라미터를 의미하고 주로 GET 요청에서 사용된다. 

- 쿼리 파라미터 시작 시 ?(Question mark)로 시작하고 파라미터들을 이어줘야 할 때 &(Asterisk)를 사용한다.

- key=value 타입으로 이루어져 있다.

 

 

 

 

4-5. HTTP Response Message의 간략한 형태

HTTP/ 1.1 200 OK       [ Status line ] 

Content-Type: application/json       [ Header ] 

 

{

"name": "A",                   [ Response Body ]

"age": null

}

         

 

(1) 클라이언트로부터 요청을 받아 적절한 처리를 마치고 응답을 반환하는 경우 서버측에서 HTTP Response message를 클라이언트측으로 보내는데 위와 같은 구조로 이루어져 있다.

 

 

(2) status line에는 요청에 대한 응답 결과에 대한 서버의 상태 코드가 포함되어 있다.

- 2XX, 3XX, 4XX, 5XX 번대로 다양한 응답 코드가 존재하며 대표적인 응답 코드는 아래와 같다.

 

- 200 : OK (정상 응답)

- 300 : Moved Permanetly (지정한 리소스가 새로운 경로로 이동된 상태)

- 404  : Not Found (지정한 리소스를 찾을 수 없는 상태)

- 500. : Internal Server Error (서버 내부에 오류가 발생한 상태)

 

(4) 응답 메시지에는 Response body 영역에 요청에 대한 적절한 응답 데이터를 담아 보낼 수 있다.

 

 

 

 

4-6. API(Application Programming Interface), RESTful API?

(1) API는 클라이언트와 서버가 HTTP를 기반으로 요청과 응답을 주고받게 되는데 만약 정해진 규약 없이 형식을 갖추지 못하고 매번 주고받게 되는 형식이 다르다면 혼란이 있을 것이다. 따라서 클라이언트와 서버(응용 프로그램)가 통신하기 위한 일종의 인터페이스(규약, 규칙)이 바로 API다.

 

(2) 웹 기반 통신에서의 API는 주로 REST(Representational State Transfer)라는 방법을 사용하는 데 REST란 자원과 행위를 명시하여 데이터를 주고받는 설계 스타일을 의미한다. 

 

(3) 엄밀히 말하면 REST는 URL 정보를 통해 시스템의 리소스(자원)을 명시하고, HTTP 메서드(GET, POST, PUT, DELETE)를 통해 자원에 대한 행위(CRUD)를 적용하는 아키텍처 패턴으로써 리소스의 표현(Representational)에 의한 상태 전달(Transfer)이다.

 

(4) 웹 개발에서 자주 듣게 되는 RESTful API는 이러한 REST의 패턴을 잘 따르고 있는 API를 말한다.

 

 

 

 

 

5. API를 개발하기 전에 필요한 작업, 다양한 Controller Annotation 

5-1. API Specification

(1) API는 일종의 규칙이기 때문에 HTTP Method, Path, Query parameter 등은 어떻게 설계할지 API 스펙을 미리 정해놓고 정해진 규칙에 따라 개발해야 한다. 

 

 

 

5-2. @RestController, @Controller

(1) 해당 어노테이션을 컨트롤러에 적용하면, API의 진입 지점으로 설정할 수 있다.

 

 

 

5-3. @GetMapping(), @PostMapping(), @PutMapping(), @DeleteMapping() ... 

(1) 이전에 공부한 내용이지만 클라이언트가 특정 URL을 기재해서 요청을 보내게 되면 DispatcherServlet이 요청 URL과 매핑된 컨트롤러를 찾고, 매핑된 컨트롤러의 내부 메서드가 실행되면서 요청에 대한 처리를 서버가 시작하게 된다.

 

(2) 위의 매핑 어노테이션들은 요청에 대한 HTTP 메서드를 지정하는 역할을 수행한다.

 

(3) 어노테이션 내부에 ("/add")처럼 요청 URL의 경로를 직접 지정할 수 있다.

 

 

 

5-4. @RequestParam

(1) 컨트롤러 내부 메서드의 파라미터에 사용할 수 있으며 실제 요청 URL의 쿼리 파라미터와 컨트롤러 메서드의 전달인자를 바인딩할 때 사용 어노테이션이다.

 

 

 

 

 

 

6. 개인 회고

 

(1) 스프링을 이전에 학습해 보며 위와 같은 내용을 배웠던 적이 있지만 현재는 조금 많은 시간이 지난 시점이다.

 

(2) 개발을 하면서 아무렇지 않게 사용했던 기본적인 용어, 이에 대한 정의와 지식들, 관련된 어노테이션 등을 다시 한 번 리마인드해 볼 수 있었다.

 

(3) 개발을 하기에 앞서 관련된 이론들을 학습하고 내 지식으로 한 번 정리해 보는 과정이 배웠던 내용들을 체화시키는 데 많은 도움이 되는 것 같다.

 

(4) 앞으로 스터디 완료 전까지 학습, 과제 수행, 프로젝트 수행에 대한 내용을 기록을 남겨가며 유의미한 시간으로 마무리해 보고자 한다.

 

 

 

※ 해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.

개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있으며, 이에 대해 댓글로 알려주시면 감사하겠습니다!

댓글