항해 99(9기)/WIL

항해 99 주차 4WIL

jossiya 2022. 10. 16. 18:11
  • 기간 10월 07일(금)~10월 13일(목)
  • 스프링 ORM, SQL, MVC

feat…… 카카오 서버실 화재로 인해 서버가 불안정해 계속 사용해오던 티스토리를 사용하지 요번에는 노션으로 작성해봤다……..

ORM 이란?

ORM 이란 Object-Relational Mapping 의 약자로, 이름 그대로 객체(Object)와 관계형 데이터(Relational data) 를 매핑하기 위한 기술이다. 이러한 매핑이 필요한 이유는 객체 지향 언어과 관계형 데이터베이스사이의 패러다임 불일치가 있기때문이다.  이 둘 간의 패러다임 불일치 때문에 개발자는 더 많은 코드를 작성해야 하며, 이는 반복적이고 실수하기 쉬운 작업이 된다. 그렇기 때문에 개발자는 객체지향적인 설계에 집중할 수 없게 된다. ORM이 바로 이러한 문제를 해결해 준다.

https://medium.com/@emccul13/object-relational-mapping-9d84807f5536

🌱 패러다임 불일치

객체 지향 프로그래밍과 관계형 데이터베이스 사이의 데이터 표현 방식이 달라서 생기는 문제를 패러다임 불일치라고 한다. 패러다임 불일치가 일어나는 이유는 애초에 이들의 목표와 동작 방식이 다르기 때문이다.

  • 객체 지향
    • 필드와 메서드 등을 묶어서 객체로 잘 만들어 사용하는 것이 목표
    • 객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.
  • 관계형 데이터베이스
    • 데이터를 잘 정규화해서 보관하는 것이 목표

🌱 JPA

JPA는 Java Persistence API의 약자로, 자바 ORM 기술에 대한 API 표준 명세이다. 즉, 인터페이스의 모음이다. 이러한 JPA 인터페이스를 구현한 대표적인 프레임워크가 하이버네이트(Hibernate)이다.JPA는 애플리케이션과 JDBC 사이에서 동작한다. 개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다. 즉, 개발자가 직접 JDBC API를 쓸 필요가 없다.

🌱 Hibernate

JPA를 구현한 프레임워크 중 사실상 표준이다. 오픈소스 소프트웨어이다. 여기서 주목해야할 점은 JPA는 기술 스펙이고 하이버네이트는 이 기능을 구현하여 공급해주는 역할이다.

🌱 Spring Data JPA

Spring framework에서 **JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트(모듈)**이다. Spring Data JPA의 목적은 JPA를 사용할 때 필수적으로 생성해야하나, 예상가능하고 반복적인 코드들을 대신 작성해줘서 코드를 줄여주는 것이다. 이는 JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 이루어진다.

Spring Data JPA는 JPA Provider이 아니다. 단지 데이터 계층에 접근하기 위해 필요한 뻔한 코드들의 사용을 줄여주도록 하는 인터페이스이다. 여기서 반드시 기억해야할 점은 Spring Data JPA는 항상 하이버네이트와 같은 JPA provider가 필요하다는 것이다.

SQL이란

SQL은 관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리 및 처리하기 위해 설계된 특수 목적의 프로그래밍 언어이며 질의(Query) 언어라고 불리기도 한다. 관계형 데이터 베이스 관리 시스템에서 자료의 검색과 관리, 데이터베이스 스키마 생성과 수정, 데이터 베이스 객체 접근 조정 관리를 위해 고안되었다. MySQL, MariaDB, MSSQL, 오라클 등의 데이터베이스 관련 프로그램들이 SQL을 표준으로 채택하고 있다.

SQL 명령어

  • DDL(Data Definition Language, 데이터 정의 언어)

: DDL은 데이터베이스 스키마와 설명을 처리하도록 정의하는 언어이다. 데이터베이스나 테이블 생성/변경/삭제 등의 작업이 포함된다.

  • CREATE(데이터베이스 개체(테이블, 인덱스, 제약조건 등)의 정의
  • DROP(데이터베이스 개체 삭제)
  • ALTER(데이터베이스 개체 정의 변경)
  • DML(Data Manipulation Language, 데이터 조작 언어)

: 데이터 검색, 삽입, 변경, 삭제 수행을 조작하는 언어이다. 실질적으로 저장된 데이터를 관리하고 처리할 때 사용한다.

  • SELECT(테이블 데이터의 검색 결과 집합의 취득)
  • INSERT(행 데이터 또는 테이블 데이터의 삽입)
  • DELETE(데이터의 삭제)
  • UPDATE(표 업데이트)
  • DCL(Data Control Language, 데이터 제어 언어)

: 사용자 관리 및 사용자별로 릴레이션 또는 데이터를 관리하고 접근하는 권한을 다루기 위한 언어이다.

  • COMMIT : 트랜잭션의 작업 결과를 반영
  • ROLLBACK : 트랜잭션의 작업을 취소 및 원래대로 복구
  • GRANT : 사용자에게 권한 부여
  • REVOKE : 사용자 권한 취소

MVC

소프트웨어 디자인 패턴 중 하나M (Model) / V (view) / C (Controller)

Model : 어플리케이션 정보, 데이터, DB 등 이다.View : 사용자에게 보여지는 화면, UI를 말한다,모델로부터 정보를 얻고 표시한다.Controller : 데이터와 비즈니스 로직사이 상호동작을 관리한다.모델과 뷰를 통제하며, MVC패턴에서 View와 Model이 직접적인 소통을 하지않도록 관리한다.

MVC 1

JSP -> View, Controller 모두 담당하나의 JSP로 유저 요청, 응답 처리 (구현의 난이도는 쉽다)

단순한 작은규모의 프로젝트에는 이 방법이 빠르고 쉽지만,큰 프로젝트에서는 확실히 나눠주는 게 좋다.JSP 하나에서 MVC가 모두 이루어지게되면 재사용성이 떨어지고,읽기도 힘들다. = 유지보수가 힘들다.

그래서 주소요청, 화면구현 따로따로 하기위해 MVC가 나온것이다.

  • 컴포넌트 기반으로 필요한 요소들을 묶어 놓았다!(* 자바를 사용해서 웹을 만들기 위한 기술이 핵심)

컴포넌트

재사용이 가능한 최소단위, 독립적인 소프트웨어 모듈 (교체가능한 부품)컴포넌트는 인터페이스를 통해서만 접근이 가능하다.컴포넌트 내 정보는 외부로부터 모두 숨겨진다. (정보 은닉)

📌 MVC 2

요청을 하나의 컨트롤러(Servlet)가 먼저 받는다.MVC 1과 다르게 역할이 분리되어있으며, M,V,C 중 수정할 부분이 생기면 그것만 꺼내어 수정하면된다. = 유지보수에 있어 장점이 있다.

spring MVC 패턴

스프링에서는 유저의 요청을 받는 DispathcerServlet이 핵심이다.이것이 Front Controller의 역할을 맡는다.Front Controller -> 우선 먼저 유저(클라이언트)의 모든 요청을 받고, 그 요청을 분석하여 세부 컨트롤러들에게 필요한 작업을 나눠주게 된다.

  1. 요청브라우저 특정 URL에 요청을 DispathcerServlet이 받는다.
  2. 요청에 매핑되는 컨트롤러를 검색요청
  • DispathcerServlet이 URI를 보고 controller를 식별하기위해핸들러 매핑과 통신한다.
  • 핸들러 매핑은 요청을 처리하는 특정 핸들러메서드를 반환(return)한다.
  1. 컨트롤러에 처리요청
  • DispathcerServlet은 특정 핸들러 메서드를 호출한다.(public String 특정메서드 (Model model)호출)
  • 핸들러 메서드는 모델과 뷰를 반환(return)한다.(public String 특정메서드 (Model model) {return "view";})
  1. 컨트롤러의 처리결과를 생성할 뷰를 결정한다.
  • DispathcerServlet은 논리적 뷰를 결정하는 뷰 리졸버를 찾아 호출한다. -> 논리적 뷰 이름을 입력한다.
  • 뷰 리졸버는 논리적 뷰 이름 -> 물리적 뷰 이름에 매핑하는 로직을 실행한다. (/template/view.html 으로 변환)
  • 예를들어,return "/hongView"; 를 아래와 같이 변경한다.src/main/resources/template/+return(논리이름)+.html
  • DispathcerServlet은 뷰를 요청해 실행한다.> 뷰에서 model 객체를 사용할 수 있게 한다.
  • DispathcerServlet은 응답을 다시 브라우저로 보낸다.> 결과화면 return

Servlet?

java언어로 웹을 구현하는 기술이며,클라이언트의 요청에 제일 먼저 반응한다.(주소요청을 받고 응답해주는 역할이다.)

ex) 브라우저에서 사용자가 입력하고, 전송하면 다시 결과값을 돌려주는데 여기가 서블릿이라 생각하면된다.

MVC 에서는 model(비즈니스로직), view(화면), controller(주소분기) 중 controller의 역할을 담당한다.

배운것

스프링 부트의 숙련 과정 강의를 보면서 Spring Security 와 JWT의 사용과정을 배웠다.

스프링 부트 공부를 시작하고 처음으로 긴코드(엄청 길지는…)를 다뤄보는 계기가 되었고.

MVC패턴의 구조를 여러가지로 짜보면서 익숙해지는 것 같았다. 그리고 JPA의 연관관계 영속성 등 을 더 알수 있게 되었다.

아쉬운점/느낀점

처음으로 스프링 부트의 SECURITY와 SECURITY의 필터를 중간에서 가로채서 JWT를 적용해 로그인 세션을 사용하지 않는 토큰을 사용하는 방법을 배웠다. 처음에는 그 과정을 이해하려고 노력을 많이 했고 그 과정에서 시간이 많이 들었다. 영상도 찾아보고 많은 문서들을 보면서 JWT를 구현 했지만

많은 부분들이 어렵게 느껴졌다. 웹페이지를 만드는 과정에서 가장 중요시 해야 할 보안 기능과 인증 인가기능 을 구현하면서 보안이 중요하다는 것을 느꼈고. 보안에 대해서 여러가지 찾아보면서 보안의 중요성을 더 알 수 있는 시간이였다.