Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 0 additions & 41 deletions week0/README.md

This file was deleted.

167 changes: 167 additions & 0 deletions week0/[0주차]전예준.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
# [WEEK 0] 온보딩 (기간 : 9/16 ~ 9/22)

## COW SPRING 6기 PRE-ONBOARDING 학습 과제

본격적으로 Spring 학습에 들어가기 전에 여러분은 객체지향 코드에 대해 학습하고 이해하는 시간을 가지실겁니다!

객체지향 코드를 짜기 위해서는 우리가 사용할 언어인 JAVA에 대해 이해하고 있어야합니다.

이 온보딩 과제는 이번 COW Server 파트에 함께 하시는 7분의 개개인의 역량이 다르기 때문에 가장 최소한으로 알고 계셔야 할 내용을 중심으로 선정해봤어요!

많은 양의 정리를 요구하지 않는 과제이니 이해하신 내용을 토대로 간단하게 정리해주시면 됩니다. (1, 2, 3, 4기의 학습자료가 github에 나와있으니 참고하셔도 좋아요☺️)

개인적으로, 분명 학습했던걸 다 기억하실 수 없으실거예요! 저도 마찬가지이고요.. 공부했던 것을 잘 정리해두는 습관을 가지는 것은 분명 큰 도움으로 돌아올 것이라 생각합니다. 그런 의미로 다들 파이팅해봐요!

---

# 필수
## www.google.com을 치면 일어나는일
Keywords : DNS, TCP/IP프로토콜, WS, WAS

*키워드 정의
-DNS는 Domain Name System의 약자로, 사람이 읽기 쉬운 도메인 이름
(예:www.google.com)을 컴퓨터가 이해하는 IP주소로 변환해주는 시스템

TCP/IP프로토콜은 인터넷에서 컴퓨터들이 서로 데이터를 주고받기 위해 사용하는 핵심 통신 규칙. IP는 데이터 조각을 올바른 목적지 주소로 보내는 주소 지정 및 경로 설정 역할을 담당하고, TCP는 그 데이터 조각들이 순서대로/빠짐없이/손상되지 않고 잘 도착했는지 확인하는 신뢰성 보장 역할

-WS(웹 서버)sms HTML, CSS, 이미지처럼 미리 만들어진 정적 콘텐츠를 사용자에게 빠르고 안정적으로 전달하는 역할.

-WAS(웹 애플리케이션 서버)는 웹 서버 기능에 더해, 데이터베이스 조회나 비즈니스 로직을 실행하여 맞춤형 동적 콘텐츠를 생성

-> 보통 효율을 위해 웹 서버를 앞에 두어 정적 요청을 먼저 처리하고, 동적 요청이 들어올 때만 WAS에게 작업을 넘겨주는 방식으로 함께 사용

--------------------------

1. IP 주소 조회
: 컴퓨터는 숫자 주소(IP주소)만 알아듣기 때문에, 따라서 가장 먼저 DNS서버에 www.google.com에 매칭되는 IP 주소를 요청하는 쿼리를 보냅니다. DNS 서버는 이 도메인 이름에 해당하는 IP 주소를 찾아 브라우저에 응답.

2. 데이터 배송 경로 설정 및 포장
: 브라우저는 알아낸 IP 주소로 사이트를 보여달라는 요청. TCP/IP프로토콜에 따라, 이 요청을 정확하게 인터넷을 통해 구글 서버까지 안전하고 정확하게 전달

3. 요청 접수 및 정적 콘텐츠 전달
: 구글 서버의 WS가 먼저 요청을 받음. 웹 서버는 로고나 기본 HTML 파일처럼 미리 만들어진 파일(정적 콘텐츠)들을 바로 보내줌
: 만약 사용자마다 내용이 달라져야 한다면, WAS가 사용자 맞춤 내용(동적 콘텐츠)을 만들어 웹 서버에 전달

4.페이지 보여주기
: 웹 서버는 받은 모든 정보(정적+동적 콘텐츠)를 합쳐 브라우저로 보냄. 브라우저는 이 정보들을 조립해서 우리가 보는 최종 화면을 완성

## API, HTTP통신
API는 프로그램의 복잡한 내부를 감추고, 약속된 규칙으로만 외부와 소통할 수 있게 만든 표준화된 규칙의 모음. 쉽게 말해, 백엔드 개발자가 “우리 서버의 기능을 사용하려면, 이런 형식으로 요청하세요“라고 미리 정해놓은 규칙의 모음

-API 사용 이유
: 분업과 협업, 보안, 확장성과 재사용성

--------------------------

HTTP 통신은 클라이언트와 서버가 API를 통해 어떻게 대화를 나눌지에 대한 통신 규칙(프로토콜). HTTP 통신은 항상 요청과 응답 한 쌍으로 이루어짐

1.요청 : 클라이언트가 서버에게 무언가를 부탁하는 것
-HTTP Method: 요청의 종류
: GET: 데이터 좀 줘
: POST: 데이터 줄게
: PUT/PATCH: 기존 데이터 바꿀게
: DELETE: 이 데이터 지워줘
-URL: 요청을 보낼 주소
-Headers: 요청에 대한 추가 정보 (ex. 어떤 형식의 데이터를 원하는지)
-Body: 서버에 전달할 실제 데이터 (POST나 PUT 요청 시, ex. 사용자의 아이디, 비밀번호)

2.응답 : 서버가 클라이언트의 요청을 처리하고 그 결과를 돌려주는 것
-Status Code: 처리 결과(ex. 404 Not Found)
-Headers: 응답에 대한 추가 정보
-Body: 클라이언트에게 전달할 실제 데이터

---

## 백엔드가 하는 일
백엔드는 우리가 사용하는 웹사이트나 앱이 정상적으로 작동하도록, 서버 뒤편에서 모든 데이터 처리와 핵심 로직을 담당

-주요 업무
1. API 개발 및 관리
: 프론트엔드가 백엔드의 기능과 데이터를 사용할 수 있도록 통신 규칙과 창구를 만드는 역할. 정해진 주소로 요청을 받아 처리하고, 그 결과를 약속된 형식으로 응답

2.비즈니스 로직 처리
: 서비스의 고유한 정책과 핵심 규칙을 코드로 직접 구현하여 데이터가 어ᄄᅠᇂ게 처리될지 결정. 단순한 데이터 저장을 넘어, 특정 조건에 따라 데이터를 가공하거나 복잡한 계산을 수행

(비즈니스 로직이란? 특정 조건에 따라 데이터를 판단하고 처리하는 모든 과정)

3.데이터베이스 관리
: 서비스의 모든 데이터를 체계적으로 설계된 구조에 맞춰 영구적으로 저장하고 관리. 데이터의 생성/조회/수정/삭제가 빠르고 안정적으로 이루어지도록 책임

(데이터 베이스란? 서비스의 모든 데이터를 영구적으로 저장하고 관리하는 디지털 서랍장)

4.서버 및 인프라 관리
: 백엔드 코드가 24시간 동작할 수 있는 실제 컴퓨터 환경을 구축하고 운영.

5.인증 및 보안
: 사용자의 신원을 확인하고, 확인된 사용자가 허용된 데이터와 기능에만 접근하도록 제어. 외부 공격으로부터 시스템과 데이터를 안전하게 보호하는 모든 활동 책임

---

## 객체지향 특징 및 장점
객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램의 복잡도를 관리하기 위해, 서로 관련 있는 데이터와 그 데이터를 처리하는 행동들을 하나의 객체로 묶고, 객체끼리는 메소드 호출으로만 소통하게 만드는 설계 방식

vs

절차 지향 프로그래밍은 정해진 순서와 절차에 따라 코드를 실행하는 방식에 집중하는 프로그래밍

-객체 지향 특징
1. 캡슐화
: 관련된 데이터와 그 데이터를 처리하는 함수를 하나로 묶어 외부의 직접적인 접근을 제한
: 객체 내부의 데이터가 외부에서 함부로 변경되지 않도록 보호하는 것이 핵심

2. 상속
: 부모 클래스의 속성과 행동을 자식 클래스가 그대로 물려받는 것을 의미.
: 코드의 중복을 줄이고, 기존 코드를 재사용하여 프로그램을 더 쉽게 확장 가능
(+ 부모 클래스가 바뀌면 모든 자식 클래스가 영향을 받기 때문에 남용 금지)

3. 다형성
: 하나의 기능이 하나의 타입으로 묶인 객체들에 따라 다르게 동작하는 특징. 즉, 같은 이름의 메서드를 호출하더라도 객체의 종류에 따라 각기 다른 방식으로 동작

4. 추상화
: 복잡한 내부 동작을 숨기고, 사용가자 필요로 하는 핵심적인 기능만 노출하는 것

-장점
1. 코드 재사용성 증가: 상속을 통해 기존 코드를 재사용하고 확장 용이
2. 유지보수 용이: 캡슐화를 통해 코드의 수정 범위를 최소화할 수 있어, 기능 변경이나 오류 수정 편리
3. 높은 신뢰성: 데이터와 기능이 묶여있고, 외부의 직접적인 데이터 접근을 막아 프로그램의 안정성이 높아짐
4. 대규모 프로젝트에 적합: 클래스 단위로 모듈화하여 개발하기 때문에 여러 개발자가 협업하기 유용

---

## 코드 컨벤션이란
코드 컨벤션은 누가 읽어도 이해하기 쉽고 일관되게 만들기 위해, 코드를 작성할 때 지키기로 약속한 일종의 코딩 스타일 규칙

-왜 중요할까?
: 가독성 향상, 협업 효율 증대, 유지보수 용이, 잠재적 오류 감소

-코드 컨벤션의 예
1. 이름 짓기 : 카멜 케이스, 파스칼 케이스, 스네이크 케이스
2. 서식 맞추기 : 들여쓰기, 한 줄의 최대 길이, 중괄호 위치, 공백
3. 주석

---

## MVC 패턴
MVC 패턴은 소프트웨어를 개발할 때 Model, View, Controller라는 세 가지 역할로 코드를 나누어 설계하는 방법으로, 각 부분이 독립적으로 움직이도록 만들어 프로그램의 유지보수성과 확장성을 높이는 것이 핵심 목표

-세 가지 구성 요소
: 모델(Model)은 프로그램의 실제 데이터와 그 데이터를 처리하는 핵심 규칙(비즈니스 로직)을 담당하는 부분으로, 오직 데이터의 가공과 처리에만 집중.
(ex.데이터베이스에서 데이터를 가져오거나, 데이터를 저장하고, 수정하는 등의 작업을 처리)

: 뷰(View)는 사용자에게 보이는 화면, 즉 UI를 담당하는 부분으로, 모델로부터 받은 데이터를 사용자가 볼 수 있도록 화면에 출력하는 역할.

: 컨트롤러(Controller)는 사용자의 입력을 받아 처리하고, 모델과 뷰 사이의 상호작용을 조율하는 역할
(ex.사용자의 행동을 감지하고, 그에 맞는 모델의 기능을 호출하여 데이터를 변경. 변경이 끝나면, 모델의 데이터를 가져와 화면에 표시하도록 뷰에게 전달.)

-MVC 패던의 동작 흐름
1.사용자가 뷰를 통해 어떠한 행동을 함
2.컨트롤러가 사용자의 요청을 받아냄
3.컨트롤러는 모델에게 필요한 데이터 처리를 요청
4.모델은 데이터베이스와 통신하는 등의 비즈니스 로직을 처리하고, 그 결과를 컨트롤러에게 돌려줌
5.컨트롤러는 모델로부터 받은 결과를 뷰에게 전달
6.뷰는 전달받은 데이터를 사용하여 사용자에게 보여줄 화면을 업데이트

-사용하는 이유
: 각 부분의 책임을 명확하게 분리하기 때문에, 디자이너는 뷰 작업에만, 백엔드 개발자는 모델 작업에만 집중할 수 있어 협업에 매우 효율적입니다.

---
22 changes: 22 additions & 0 deletions week3/[3주차]전예준.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
## 로또 과제를 하면서 알게된 점

### MVC 패턴
Domain(Model), View, Controller로 나누어서 설계하려고 노력했다. Domain에서는 게임의 규칙과 데이터를 담당하도록 했고, View에서는 사용자의 입출력에만 담당하게 구성했다. 마지막으로 Controller에서는 Domain과 View 사이에서 실행하고 전달하는 중재자 역할을 하도록 했다.

### 일급 컬렉션
List<Lotto>를 그냥 사용하는 대신 Lottos로 감싸서 사용하도록 했다. 일급 컬렉션은 쉽게 말해 컬렉션 하나를 책임지는 관리자 클래스이다. 일급 컬렉션을 사용하면 컬렉션과 관련된 로직을 한곳에 모을 수 있어서 코드가 단순하고 명확해진다. 또한 일급 컬렉션을 사용하면 데이터의 무결성, 즉 데이터의 안전성을 높인다.

### Enum
Enum은 서로 관련 있는 고정된 값들의 묶음을 정의하는 특별한 데이터 타입이다. enum을 사용하면 정해진 선택지 안에서만 값을 사용하도록 강제해 실수를 막을 수 있다. enum에서 상수는 단순한 값이 아니라 데이터와 메서드를 가질 수 있는 하나의 완전한 객체이다. enum을 사용하면 코드의 가독성과 유지 보수성을 높이기 때문에 Rank enum을 만들어 사용했다. Rank enum에 상금, 번호 일치 개수 정보까지 담기니 가독성이 높아지고 사용하기 편리했다.

### 스트림 API
스트림은 데이터의 흐름을 만들어두고, 여러 단계의 연산/가공을 거쳐 최종 결과물을 만드는 방식이다. 스트림 API의 형식은 data.stream().중간연산().최종연산()이다. 로또 프로그램에서 중복된 번호가 있는지, 범위가 벗어나는 번호가 있는지 검사할 때 사용했다.

### Scanner
사용자에게 입력을 받을 때, nextInt()를 사용했었는데 nextInt()는 \n을 남기기 때문에 문자가 발생했다. 이는 nextInt()는 토큰 기반으로 데이터 토큰만 읽고, \n는 읽지 않고 그대로 두기 때문이다. 반대로 nextLine()은 라인 기반으로 \n을 만날 때까지 모든 문자를 읽어들인다. 이러한 차이 때문에 nextLine()으로 받고 변화해서 사용했다.


### 개선점 & 추가 공부
-피드백을 보면 컨트롤러가 너무 많은 일들을 담당하고, 협력 객체를 직접 생성하고 있기 때문에 결합도가 너무 높다는 것다는 것을 보아 아직 체계적으로 분리가 안된 거 같다.
-피드백에서 알려주신 DTO, AppConfig에 대해서 추가 공부를 해야 할 거 같다.