본문 바로가기
TIL

내일배움캠프 5주차 Spring MVC 디자인 패턴, 정적페이지

by 율량동박씨 2024. 5. 14.

오늘의 키워드

  • Spring MVC
  • 정적 페이지와 동적페이지
  • Jackson
  • Path Variable과 Request Param
  • DTO
  • Database
  • @ModelAttribute
  • JDBC(Java Database Connectivity)

오늘의 내용

  • MVC 디자인 패턴
    • Model, View, Controller의 약자로 소프트웨어 디자인 패턴 중 하나
    • 코드의 재사용성과 유지보수성을 높이고 개발자들 간의 협업을 용이하게 해 준다
      • Model : 데이터와 비즈니스 로직을 담당하고 데이터 베이스와 연동해 데이터를 저장하고 불러오는 등의 작업을 수행한다
      • View : 사용자 인터페이스를 담당하고 사용자가 보는 화면을 디자인하고 구현한다
      • Controller : Model과 View 사이의 상호작용을 조정하고 제어하는데 사용자 입력을 받아 Model에 전달하고 결과를 바탕으로 View를 업데이트한다
    • Spring MVC : Spring에서 MVC를 적용해 HTTP요청을 효율적으로 처리한다
      • Sevlet(서블릿) : 자바를 사용해 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양을 말한다
      • DispatcherServlet : 객체는 분석한 데이터를 토대로 Handler Mapping을 통해 Controller를 찾아 요청을 전달, 직접 Servlet을 구현하지 않아도 DispatcherServlet에 의해 간편하게 HTTP 요청을 처리할 수 있다
  • 정적 페이지와 동적 페이지
    • 정적 페이지 : 항상 같은 내용을 보여주는 페이지, 클라이언트가 url을 통해 서버에 웹페이지를 요청하면 서버 안에 이미 만들어 놓은 html문서를 보여준다
    • 동적 페이지 : 요청에 대해 각각 다른 내용을 보여주는 페이지, 클라이언트가 요청을 하면 서버는 사용자에 맞는 html문서를 보여준다
  • Jackson
    • 데이터 구조를 처리해 주는 라이브러리이다
    • Object를 Json타입의 String으로 변환해 줄 수 있다
    • Json타입의 String을 Object로 변환해줄 수 있다
    • Spring 3.0 버전 이후 소스 코드를 작성해 Json데이터를 처리하지 않아도 자동으로 처리해 준다
    • 직접 Json 데이터를 처리해야 할 때는 Jackson 라이브러리의 ObjectMapper를 사용한다
  • Path Variable과 Request Param
    • Path Variable
      • 서버에 보내려는 데이터를 url경로에 추가할 수 있다
      • 데이터를 받기 위해서는 /star/{name}/age/{age} 이처럼 url경로에서 데이터를 받고자 하는 위치에 경로를 {data} 중괄호를 사용한다
      • 요청 메서드 파라미터에 @PathVariable 애너테이션과 함께 {name} 중괄호에 선언한 변수명과 변수타입을 선언하면 해당 경로의 데이터를 받는다 (@PathVariable String name, @PathVariable int age) 
      • @PathVariable(required = false) required 옵션을 false로 설정하면 Client에서 전달받은 값들에서 해당 값이 포함되어있지 않아도 오류가 발생하지 않는다
      • 경로 변수를 표시하기 위해 메서드에 매개변수에 사용된다
      • 경로 변수는 반드시 값을 가져야 하고 값이 없으면 404 오류가 발생한다
    • Request Param(=쿼리 스트링)
      • 서버에 보내려는 데이터를 url경로 마지막에 ?와 &을 사용해 추가할 수 있다
      • (사용예시 : ?name=Robbie&age=95)
      • RequestParam은 생략이 가능하다
      • @RequestParam(required = false) 이렇게 required 옵션을 false로 설정하면 Client에서 전달받은 값들에서 해당 값이 포함되어있지 않아도 오류가 발생하지 않는다
      • Client로부터 값을 전달받지 못한 해당 변수는 null로 초기화된다
  • HTTP데이터를 객체로 처리하는 방법
    • @ModelAttribute 에너테이션을 사용하면 Java의 객체로 데이터를 받아올 수 있다
    • @ModelAttribute는 생략이 가능하다
    • Spring은 해당 파라미터(매개변수)가 SimpleValueType이라면 @RequestParam으로 간주하고 아니면 @ModelAttribute가 생략되어 있다고 판단한다(SimpleValueType은 원시타입(int), Wrapper타입(Integer), Date 등의 타입을 의미)
    • @RequestBody : HTTP Body에 JSON데이터를 담아 서버에 전달할 때 해당 Body 데이터를 Java의 객체로 전달받을 수 있다
    • HTTP Body에 {"name":"Robbie","age":"95"}  JSON 형태로 데이터가 서버에 전달되었을 때 @RequestBody 애너테이션을 사용해 데이터를 객체 형태로 받을 수 있다
    • 데이터를 Java의 객체로 받아올 때 주의사항
      • 해당 객체의 필드에 데이터를 넣어주기 위해 set이나 get 메서드 또는 오버로딩된 생성자가 필요하다(예를 들어 @ModelAttribute 사용하여 데이터를 받아올 때 해당 객체에 set 메서드 혹은 오버로딩된 생성자가 없다면 받아온 데이터를 해당 객체의 필드에 담을 수 없다)
  • DTO(Data Transfer Object)
    • 데이터 전송 및 이동을 위해 생성되는 객체이다
    • Client에서 보내오는 데이터를 객체로 처리할 때 사용된다
    • 서버의 계층 간 이동에도 사용된다
    • DB와 소통을 담당하는 Java클래스를 그대로 Client에 반환하는 것이 아니라 DTO로 한 번 변환한 후 반환할 때도 사용된다
    • Request의 데이터를 처리할 때 사용되는 객체는 RequestDro, Response를 할 때 사용되는 객체는 ResponseDto라는 이름을 붙여 DTO클래스를 만들 수 있다
  • DBMS
    • Database Management System은 DB를 관리하고 운영하는 소프트웨어이다
    • RDBMS는 Relational DBMS로 관계형 데이트 베이스라고 한다. 테이블이라는 최소 단위로 구성되며 이 테이블은 열과 행으로 이루어져 있다. 테이블 간 FK(Foreign Key)를 통해 다른 데이터를 조합해서 함께 볼 수 있는 장점이 있다
  • SQL(Structured Query Language)
    • RDBMS에서 사용되는 언어로 많은 정보를 DB에서 조작하고 관리하기 위해 사용한다
    • DDL(Data Definition Language) : 테이블이나 관계의 구조를 생성한다
      • CREATE : 새로운 데이터베이스 및 테이블을 생성한다
      • ALTER : 데이터베이스와 테이블의 내용을 수정한다
      • DROP : 데이터베이스와 테이블을 삭제, 데이터 및 테이블 전체를 삭제한다
      • TRUNCATE : 데이터베이스와 테이블을 삭제, 최초 테이블이 만들어졌던 상태 즉 칼럼값만 남긴다
    • DCL(Data Control Language) : 데이터의 사용 권한을 관리한다
      • GRANT : 사용자 또는 ROLE에 대해 권한을 부여한다
      • REVOKE : 사용자 또는 ROLE에 부여한 권한을 회수한다
    • DML(Data Manipulation Language) : 테이블에 데이터를 검색, 삽입, 수정, 삭제에 사용한다
      • INSERT : 테이블에 새로운 row를 추가한다
      • SELECT : 테이블의 row를 선택한다
      • UPDATE : 테이블의 row의 내용을 수정한다
      • DELETE : 테이블의 row를 삭제한다
    • CREATE의 제약조건
      • AUTO_INCREMENT : 칼럼의 값이 중복되지 않게 1씩 자동으로 증가하게 해 줘 고유 번호를 생성한다
      • NOT NULL : 해당 필드는 NULL값을 저장할 수 없다
      • UNIQUE : 해당 필드는 서로 다른 값을 가져야만 한다
      • PRIMARY KEY : 해당 필드가 NOT NULL과 UNIQUE 제약 조건의 특징을 모두 가지게 된다
        • 기본 키라고도하며 '유일하게 존재하는 값을 조합을 설정'하여 중복된 데이터가 테이블에 삽입되는 것을 방지하는 제약조건
        • 기본 키를 설정하면 DBMS는 인덱스를 만드는데 해당 데이터를 빨리 찾을 수 있게 도와주는 목차 같은 역할을 해서 데이터를 매우 빠르게 찾을 수 있다
      • FOREIGN KEY : 하나의 테이블을 다른 테이블에 의존하게 만들며 데이터의 무결성을 보장한다
        • 외래 키라고도 하며 두 개의 테이블을 연결하는 다리 역할을 한다
        • 외래 키 역시 기본 키와 같은 중복된 데이터가 삽입되는것을 방지한다
        • 외래 키는 데이터가 새롭게 추가될 때 외래 키에 해당하는 값이 외래 키가 참조하는 테이블에 존재하는지를 확인한다
      • CASCADE : FOREIGN KEY로 연관된 데이터를 삭제, 변경할 수 있다
    • JOIN
      • 나누어진 테이블을 하나로 합치기 위해 데이터베이스가 제공하는 기능이다
      • ON이라는 키워드를 통해 기준이 되는 칼럼을 선택하여 2개의 테이블을 합쳐준다
      • JOIN을 할 때 적어도 하나의 칼럼을 서고 공유하고 있어야하기 때문에 테이블에 외래 키가 설정 되어 있다면 해당 컬럼을 통해 JOIN을 하면 조건을 충족할 수 있다
      • JOIN을 위해 외래키 설정은 필수가 아니다 외래 키를 사용하면 데이터 무결성을 확인하는 추가 연산이 발생하거나 무결성을 지켜야 하기 때문에 상황에 따라 불편을 초래한다
    • JDBC(Java Database Connectivity)
      • Java에서 DB로 접글할 수 있도록 하는 API이다
      • JDBC에 연결해야 하는 DB의 JDBC 드라이버를 제공하면 DB 연결 로직을 변경할 필요 없이 DB 변경이 가능하다
      • MySQL 드라이버를 사용해 DB에 연결을 하다 PosrgreSQL 서버로 변경이 필요할 때 드라이버만 교체하면 손쉽게 DB 변경이 가능하다
      • JDBC Template : JDBC의 등장으로 손쉽게 DB교체가 가능해졌지만 아직도 DB에 연결하기 위해 여러 로직들을 직접 작성해야 한다는 불편함 있었는데 이러한 불편함을 해결하기 위해 커넥션 연결, statement 준비 및 실행, 커넥션 종료 등의 반복적이고 중복되는 작업들을 대신 처리해 준다

 

오늘의 회고

  • Spring 이틀 차에 접어들었는데 Java와는 완전 다른 언어로 느껴진다
  • 강의를 다 못 들어서 아직 프로젝트를 시작도 하지 못해 걱정이 많이 된다......