TIL ... 3주차 day 15 - Spring 6일차 마지막... 22.05.26

BYEONGMIN CHOI·2022년 5월 26일
0

TIL(Today I Learned)

목록 보기
11/24

프로그래밍을 배우고 있습니다. 아래 내용이 틀린점이 있거나 수정해야하는 부분이 있다면 댓글로 알려주시면 내용에 반영하여 수정하겠습니다. 감사합니다.

스프링 입문 주차가 끝나는 하루였다. 개인 과제를 하며 많은 이슈가 발생하였고, 발생한 이슈를 해결하는데 있어 팀원들과 의견을 주고받고 구글링도 하면서 해결해 나간 경험이 크지는 않지만 점점 누적된다는 느낌이 들어 자신감이 조금씩 생기는 중이다.

과제를 풀며 이전 TIL에서도 언급한 @RequestBody에 관련된 이슈 정리를 하려한다.

client으로 전달하는 방식에서 jackson 형식의 객체를 json 형식으로 전달 하는 과정에 대한 얘기이다.
데이터 맵핑이 과정에서 DTO 객체를 사용하게 되는데 이때 DTO의 기본생성자의 생성을 @NoArgsConstructor로 생성한 DTO 객체를 다시 json 형식으로 client에 전달하는 방식을 이해하는데 어려움이 있었다.

참고 사이트를 통해 json - jackson 형식의 데이터를 ObjectMapper로 바인딩하는 과정을 살펴보고 기본생성자를 무조건 생성해야 @RequestBody를 사용할 수 있다는 걸 알게 되었다.

#1 RequestBody에 기본생성자는 왜_필요한가?
#2 RequestBody에 기본생정자는 필요하고_ Setter는 필요없을까?
#3 @RequestBody에 왜 기본 생성자는 필요하고, Setter는 필요 없을까?

3주차 과제 githuh : https://github.com/DeveloperChoi90/W3_spring_basicHomework/tree/main/W3_HomeWork


팀과제 정리

🔐 JPA 가 무엇인가요?

JPA (Java persistence API )

  • 자바의 ORM기술에 대한 API 표준 명세
  • JPA는, SQL을 쓰지 않고 데이터를 생성, 조회, 수정, 삭제할 수 있도록 해주는 번역기입니다.
  • 실제 구현된것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크입니다.

ORM (Object Relational Mapping)

  • 객체와 DB의 테이블을 맵핑을 이루는 것
  • ORM을 이용하면 SQL Query가 아닌 직관적인 코드로 데이터를 사용할 수 있다.
  • OOP(Object Oriented Programming)에서 쓰이는 객체라는 개념을 구현한 클래스와 RDB(Relational DataBase)에서 쓰이는 데이터인 테이블 자동으로 매핑(연결)하는 것을 의미합니다.
  • RDB는 관계형 데이터베이스 엑셀시트처럼 빈칸에 내용을 쌓아가는 데이터베이스 방식입니다.
    그러나 클래스와 테이블은 서로가 기존부터 호환가능성을 두고 만들어진 것이 아니기 때문에 불일치가 발생하는데, 이를 ORM을 통해 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하여 불일치를 해결합니다.

🔐 Controller, Service, Repository 가 무엇인가요

MVC 패턴

  • MVC패턴은 Model-View-Controller의 약자로서 개발을 할 때 3가지 형태로 역학을 나누어 개발하는 방법론

  • Model

  • 어플리케이션이 무엇을 할 것인지 정의하는 부분, DB와 연동하여 사용자가 입력한 데이터나 사용자에게 출력할 데이터를 다룬다.

  • View

  • 사용자에게 시각적으로 보여주는 부분(UI)

  • Controller

  • Model이 데이터를 어떻게 처리할지 알려주는 역할, 사용자에 의해 클라이언트가 보낸 데이터가 있으면 모델을 호출하기전에 적절히 가공하고 모델을 호출

  • 모델이 수행을 완료하면 그 결과를 가지고 View에 전달

Spring

Controller

  • Controller는 MVC패턴에서 C에 해당 하며 주로 사용자의 요청을 처리 한 후 지정된 뷰에 모델 객체를 넘겨주는 역할
  • 클라이언트의 요청을 받음
  • 요청에 대한 처리는 서비스에게 전담
  • 클라이언트에게 응답

Service

  • 클라이언트의 요청은 Controller에 의해 받아지고 Controller는 요청을 처리하기 위해 Service를 호출합니다. Service는 알맞은 정보를 가공하여 Controller에 전달합니다.
  • 사용자의 요구사항 처리
  • DB 정보가 필요할 때는 Repository에게 전담

Repository

  • Entity에 의해 생성된 DB에 접근하는 메서드 들을 사용하기 위한 인터페이스
  • DB 관리(연결, 해제, 자원 관리)
  • DB CRUD 작업 처리

🔐 restAPI의 put 과 patch 는 어떤 차이점이 있을까요? 어떤 경우에 사용하면 좋을까요?

RESTful API 를 사용할 때 UPDATE 하는 부분에서 PUT or PATCH 를 사용한다.

두 개의 차이점

  • PUT : 자원 전체 교체 (자원의 모든 필드 필요) (만약 입력하지 않았을 경우 null로 받지만 get으로 받아온 값을 그대로 입력하게 하여 방지할수있다)
  • PATCH : 자원의 부분 교체 (자원의 일부 필드 필요)
  • 예시 기존 DB에 있는 데이터가 아래와 같다면
{
  "id": 1,
  "title" : "test",
  "body" : "contents"
}
  • 요청
{
  "title" : "변경된 test"
}
  • PATCH 결과
{
  "id": 1,
  "title" : "변경된 test",
  "body" : "contents"
}

  • PUT 결과
{
  "title" : "변경된 test"
}
  • PUT, PATCH를 어느 경우에 사용하면 좋을까?

PUT은 전체 데이터를 다시 한번 더 입력하면서 확인성을 더 확인할 수 있다고 생각한다.

그래서 금융권 등 보안이 필요한 부분에 사용하면 좋을 것 같다.

PATCH은 개인정보 변경(주소, 핸드폰번호 등) 한 가지만 변경 할 때 유용한 것으로 생각한다.

🔐 우리가 브라우저에서 구매한 도메인 주소를 입력하면 만들어 놓은 aws EC2 서버까지 전달이 되어서 해당 서버에게 요청을 보낼 수 있습니다. 이 과정이 상세하게 어떻게 진행되는지 그림으로 한번 그려볼까요?

  • AWS EC2 작동 방식

  • 배포 과정

  • 전세계적으로 http의 port 80번이 기본 포트이기 때문에 우리가 배포한 서버의 port인 port 8080을 port 80로 redirect 해주어 사용한다.

  • 배포된 http로 client가 요청을 하면 NGINX를 통해 백엔드 서버에 요청을 하고 서버에서 요청을 처리 후 다시 client에게 보여진다.

참고 사이트 : https://hs5555.tistory.com/34

DIY Section

🔑 Q1. RDBMS 란 무엇인가?

RDB (Relational DataBase)

  • 관계형 데이터 모델에 기초를 둔 데이터 베이스
  • 모든 데이터를 2차원의 테이블 형태로 표현

RDBMS ( Relational DataBase Management System)

  • RDB를 생성하고 수정하고 관리할 수 있는 소프트웨어
  • 관계형 모델을 기반으로하는 DBMS 유형
  • RDBMS의 테이블은 서로 연관되어 있어 일반 DBMS보다 효율적으로 데이터를 저장, 구성 및 관리 할 수 있다.
  • 정규화를 통해 데이터의 중복성을 최소화하며 트랜잭션을 수행하는 것이 더 쉽다.
    • DB정규화
      • 1차 정규화 : 원자 값을 가져야한다.
      • 2차 정규화 : 완전 함수적 종속이어야 한다.
      • 3차 정규화 : 이행적 함수 종속이 없는 것(기본키 이외의 다른 컬럼이 그외 다른 컬럼을 결정할 수 없는 것.)
      • BCNF : 3차정규형을 만족하면서 모든 결정자가 후보키 집합에 속한 정규형
    • 트랜잭션 : 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용하는 단위
    • 트랜잭션의 특징 (ACID)
      • 원자성(Atomicity) : 회복성 보장, commit/roll back, 트렌젝션은 분해가 불가능한 논리적 최소 단위로 실행 전체가 승인되거나 취소 되어야함. ex) 은행 계좌에서 출금기능을 사용할 때 출금 기능이 오류로 인해 완료되지 않으면 rollback을 통해 취소 되어져야함. 즉 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한 다는 것.
      • 일관성(Consistency) : 트랜잭션이 진행되는 동안에 데이터베이스가 변경 되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는 것이 아니라, 처음에 트랜잭션을 진행하기 위해 참조한 데이터베이스로 진행된다. 이렇게 함으로 써 각 사용자는 일관성 있는 데이터를 볼 수 있는 것이다.
      • 고립성(Isolation) : 독립성은 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 경우에 어느 하나의 트랜잭션이라 도 다른 트랜잭션의 연산을 끼어들 수 없다. 하나의 특정 트랜잭션이 완료될 때 까지, 다른 트랜잭션이 특정 트랜잭 션의 결과를 참조할 수 없다.
      • 지속성(Durability) : 지속성은 트랜잭션이 성공적으로 완료되었을 경우, 결과는 영구적으로 반영되어야 한다는 점 이다.
  • RDBMS의 몇가지 예
    • MSSQL, MySQL, Oracle 등…

🔑 Q2. DAO, DTO란?

DAO

데이터 사용기능 담당 클래스이다. DB 데이터 조회나 수정, 입력, 삭제와 같은 로직을 처리하기 위해 사용한다. CRUD의 기능을 한다고 보면 된다. DAOInterface/DAOImplement 로 구분지어 명세와 구현 분리하며 개발한다.

DTO

데이터 저장 담당 클래스이다. Controller, Service, View처럼 계층 간의 데이터 교환을 위해 쓰인다. 로직을 갖고 있지 않으며 순수한 데이터 객체이며 getter, setter 메소드만을 갖고 있다.

🔑 Q3. 왜 우리는 Spring Framework를 사용하면서 NOSQL이 아닌 SQL을 사용하는 이유?

언어적 특성때문이라고 생각한다.

Spring의 경우 Java 기반의 언어를 사용하며 JPA

프레임워크을 구성하고 있는 java언어의 특성 때문인 것 같다.

-spring은 멀티쓰레드라 안정성이 보장되는 프레임 워크입니다. 그래서 무거운 비즈니스 로직이 들어가도 안정적인 서비스가 가능합니다.

보통 이럴 경우 관계형 DB를 사용하는데 RDB 중 오라클도 있고 등등 많은데 왜 굳이 MYSQL이 많이 사용되는 이유는 무료이기 떄문입니다.

  • Node.js는 싱글쓰레드라 spring에 비해 비교적 가볍게 쓰기 좋은 환경인데, 그래서 하나의 작업자체가 오래걸리는 웹서비스에는 적합하지 않아서 RDB를 쓰기보다는 NoSql을 사용해서 로그 쌓기나 단순 속도 작업을 하는게 유리합니다.

그리고 Nosql은 대용량 처리에 적합합니다. 하루에 방대한 양의 로그가 쌓이는 웹서비스에서는 대용량 처리에 좋은 Nosql을 사용합니다.

로그 쌓는건 특별한 로직이 필요 없기때문에 가벼운 환경의 node.js를 많이 쓰는 것 같습니다.

🔑 Q4. 웹 개발중 http 응답 에러코드가 발생하는 경우가 있는데 자주 발생하는 응답오류코드가 무엇이 있는가?

많이 사용되는 응답코드

200번대 : 성공: 이 작업을 성공적으로 받았고, 이해했으며, 받아들여졌다는 의미, 보통 200, 204, 206 코드를 확인한다.

  • 200 OK: 성공적으로 처리했을 때 쓰인다. 가장 일반적으로 볼 수 있는 HTTP 상태.
  • 202 Accepted: 요청이 받아들여졌지만 처리되지 않았음을 의미한다.
  • 204 No Content: 성공적으로 처리했지만 컨텐츠를 제공하지는 않는다. 일반 사용자가 볼 일은 거의 드물며 처리 결과만 중요한 API 요청 등에서 주로 사용한다
  • 206 Partial Content: 컨텐츠의 일부 부분만 제공한다. 보통 클라이언트에서 시작 범위나 다운로드할 범위를 지정한 경우 자동으로 해당 부분만 제공할 때 사용하는 코드이다.

400번대: 클라이언트 오류: 이 요청은 올바르지 않다는 의미이다. 여기서부터 브라우저에 직접 표출된다. 굵게 강조된 것은 자주 보이는 오류들

  • 400 Bad Request : (잘못된 요청): 요청 자체가 잘못되었을 때 사용하는 코드
  • 403 Forbidden(거부됨) : 서버가 요청을 거부할 때 발생한다. 관리자가 해당 사용자를 차단했거나 서버에 index.html 이 없는 경우에도[5] 발생할 수 있다. 혹은 권한이 없을 때(로그인 여부와는 무관하다)에도 발생한다.
  • 404 Not Found(찾을 수 없음): 찾는 리소스가 없다는 뜻으로, 가장 흔하게 볼 수 있는 오류 코드

500번대 : 서버 오류: 서버가 응답할 수 없다는 의미이며, 요청이 올바른지의 여부는 알 수 없다.

  • 500 Internal Server Error (내부 서버 오류): 서버에 오류가 발생해 작업을 수행할 수 없을 때 사용된다. 보통 설정이나 퍼미션 문제. 아니면 HTTP 요청을 통해 호출한 문서가 실제 HTML 문서가 아니라 JSP, PHP, 서블릿 등의 프로그램일 경우 그 프로그램이 동작하다 세미콜론을 빼먹는 등의 각종 에러로 비정상 종료를 하는 경우 이 응답코드를 보낸다.
  • 502 Bad Gateway(게이트웨이 불량): 게이트웨이가 연결된 서버로부터 잘못된 응답을 받았을 때 사용된다.

🔑 Q5. https / SSL이 무엇인가?

  1. HTTPS란?
  • HTTP(Hypertext Transfer Protocol)에서 보안을 강화하기 위해서 S(Over Secure Socket Layer)의 약자 더 한 것으로 기존의 HTTP가 정보를 텍스트 형태로 주고 받기 때문에 중간에서 정보를 가로챌 경우 데이터가 그대로 유출되거나 심할 경우 변조 될 가능성이 있었는데 보안을 위에 S라는 보안계층을 추가하여 정보를 암호화한 다음에 주고 받도록 한 것이다.
  1. SSL란?
  • HTTPS의 보안 계층에서 사용되는 여러 보안 프로토콜 중 한 가지로 가장 많이 사용되고 있는 보안 프로토콜이다. SSL과 TLS는 서로 같은 말이고 버전에 따라 다르게 표시한 것 뿐이다. 그리고 SSL의 경우 하나의 독립적 보안 프로토콜이기 때문에 FTP나 SMTP같은 다른 프로토콜에서 사용이 가능하다.
profile
스스로 성장하는 개발자가 되겠습니다.

0개의 댓글