Today I Learned

2024 스파르타 내일배움캠프 Sping 트랙 참여 // day26

shinelee26 2024. 11. 6. 23:21

오늘 진행한 학습 요약

1. 기초 Spring  6주차

  • Layered Architecture
  • Database
  • 트랜잭션(Transaction)
  • RDBMS
  • SQL(Structured Query Language)
  • MySQL.
  • JDBC
  • Statement VS Prepared Statement
  • 웹 보안
  • Persistence Framework
  • SQL Mapper

2. CH 3 일정 관리 앱 만들기

  • 일정 등록 API 구현
  • 트러블 슈팅
일정관리 앱 Git-hub 링크 : https://github.com/chews26/Schedule-jdbc

 

3. 알고리즘 코드카다  Day22 (작성 생략)

CodingTest Git-hub 링크 : https://github.com/chews26/CodingTest

 


학습 정리

1. 기초 Spring  6주차

  • Layered Architecture
    • 애플리케이션을 세 가지 주요 계층으로 나누어 구조화하는 방법
    • 명확한 역할 분담이 이루어져 코드의 재사용성, 유지보수성, 확장성을 높이는 데 도움
    • Presentation Layer
      • 사용자의 요청을 받고 응답하는 역할을 수행
    • Business Layer(Service Layer)
      • 비지니스 로직을 수행
    • Data Access Layer(Repository Layer)
      • 데이터베이스와 연동
    • DTO(Data Transfer Object)
      • 계층간 데이터 전달을 위해 사용되는 객체
      • 데이터를 옮기기 위한 상자
    • Model
      • Entity
      • 추후 숙련주차에 배울 JPA와 관련
      • JPA에서는 Entity라는 형태로 데이터를 반환
    • DAO(Data Access Object)
      • 데이터베이스와의 상호작용을 캡슐화하여 애플리케이션의 다른 부분에서 데이터베이스에 직접 접근하지 않도록 해주는 디자인 패턴
  • Database
    • 여러 사람이 공유하고 사용할 목적으로 한 곳에서 관리되는 데이터의 조직화된 집합
    • 데이터베이스 관리 시스템(DBMS)에 의해 제어
    • DBMS(Database Management System)?
      • Database를 관리하고 운영하는 시스템
      • SQL이라는 언어로 DBMS에 데이터 관리를 요청하면 DBMS가 요청을 처리
      • 관계형 DMBS(RDBMS)
        • 데이터를 테이블 형태로 구조화하여 저장하고 관리하는 시스템
        • Oracle, MySQL, PostgreSQL, Microsoft SQL Server
      • 비관계형 DBMS(NoSQL)
        • key-value, document, graph 등의 다양한 형태로 데이터를 저장하고 관리
        • MongoDB, Cassandra, Redis
      • 다중 모델 DBMS
        • 하나의 데이터베이스 관리 시스템에서 여러 데이터 모델을 지원하는 시스템
        • 관계형 데이터뿐만 아니라 문서형, 그래프형 데이터를 함께 관리
        • Amazon DynamoDB, Microsoft Azure Cosmos DB
  • 트랜잭션(Transaction)
    • 데이터베이스에서 하나의 논리적인 작업 단위
    • 트랜잭션으로 묶여있는 작업들은 모두 성공적으로 완료되거나 하나라도 실패하면 전체가 취소
  • RDBMS
    • 관계형 데이터베이스 RDB(Relational DataBase)를 관리할 수 있는 소프트웨어
    • RDBMS에서 데이터는 테이블이라는 구조에 저장되며 행(row)과 열(column)로 구성
    • 테이블 간의 관계는 외래 키(Foreign Key)를 통해 설정
  • SQL(Structured Query Language)
    • SQL은 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 정의, 조작, 제어, 조회하기 위해 사용되는 표준 프로그래밍 언어
    • 데이터를 생성(Create), 읽기(Read), 갱신(Update), 삭제(Delete)하는 작업을 수행
    • DDL(Data Definition Language)
    • DML(Data Manipulation Language)
    • DQL(Data Query Language)
    • DCL(Data Control Language)
    • TCL(Transaction Control Language)
  • JDBC
    • Java 언어를 사용하여 DB와 상호 작용하기 위한 자바 표준 인터페이스
    • 데이터베이스 관리 시스템(DBMS)과 통신하여 데이터를 삽입(C), 검색(R) , 수정(U) 및 삭제(D)
    • 표준 API
    • 데이터베이스 연결
    • SQL 쿼리 실행
    • Prepared Statement
    • 결과 집합 처리(Result Set)
    • 트랜잭션 관리
  • Statement VS Prepared Statement
    • Java에서 데이터베이스에 SQL 쿼리를 실행하기 위한 인터페이스
    • 이터베이스와의 통신을 통해 쿼리 결과를 반환하거나 데이터 조작을 수행하는 데 사용
    • Statement
      • DB와 연결되어 있는 Connection 객체를 통해 SQL문을 Database에 전달하여 실행하고, 결과를 반환받는 객체
    • Prepared Statement
      • SQL문을 Complie 단계에서 ? 를 사용하여 preCompile 하여 미리 준비해놓고 Query문을 파라미터 바인딩 후 실행하고 결과를 반환
  • 웹 보안
    • SQL Injection
      • 악의적인 사용자가 애플리케이션에서 입력 데이터를 이용하여 SQL 쿼리를 조작하고 데이터베이스에 무단 접근하거나 데이터를 변조하는 공격
      • Error Based SQL Injection
        • Database에 고의적으로 오류를 발생시켜 에러 응답을 통해 DB 구조를 파악
      • Union Based SQL Injection
        • 컬럼의 개수와 데이터 형식이 같아야 한다
        • DB의 UNION 연산자를 사용하여 쿼리 결과값의 조합을 통해 정보를 조회
      • Blind Based SQL Injection
      • Stored Procedure SQL Injection
      • Time Based SQL Injection
      • 해결방법 : 클라이언트에게 에러 메세지 노출을 차단
    • XSS(Cross Site Scription)
      • 악성 스크립트를 웹사이트에 주입하는 Code Injection 기법
      • Stored XSS
        • 공격자가 취약점이 있는 Web Application에 악성 스크립트를 영구적으로 저장하여 다른 사용자에게 전달하는 방식
      • Reflected XSS
        • 외부 링크 페이지로 이동
      • DOM based XSS
      • 해결방법 : 입/출력 값을 검증(Validation)하고 필터링하여 해결, 외부 보안관련 라이브러리를 사용, 보안 솔루션을 사용
  • Persistence Framework
    • 애플리케이션에서 데이터를 영구적으로 저장하고 관리하기 위해 데이터베이스와 같은 저장소와의 상호 작용을 단순화하는 소프트웨어 도구
  • SQL Mapper
    • 직접 작성한 SQL 문의 실행 결과와 객체(Object)의 필드를 Mapping하여 데이터를 객체화
    • Spring JDBC Template
      • Spring Framework에서 제공하는 JDBC 작업을 단순화하고 개선한 유틸리티 클래스
    • JDBC Template의 장점
      • 간편한 데이터베이스 연결
      • Prepared Statement를 사용한다.
      • 예외 처리와 리소스 관리
      • 결과 집합(ResultSet) 처리
      • 배치 처리 작업을 지원한다.

 


2. CH 3 일정 관리 앱 만들기

 

일정 등록 API 구현

  • Postman을 통해 테스트를 진행하였고 아래와 같이 값이 저장되었다.
  • 필수구현부터 진행하기로 결정했다.

 

트러블 슈팅

  •  ScheduleRequestDto
    • LocalDateTime은 ISO-8601 형식(yyyy-MM-dd'T'HH:mm:ss)을 요구하기때문에 T문자가 포함되어야한다고 한다.
    • 입력값에서 T를 입력받는 것은 원하는 방향이 아니므로 수정하는 방법을 찾아봤다.
    • Json에서 원하는 포맷으로 입력받고 싶을 때는 @JsonFormat을 통해 패턴을 정하면 된다.
    • 참고사이트 : https://addio3305.tistory.com/101
@Getter
public class ScheduleRequestDto {

    private String title;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startDateTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endDateTime;
    private String description;
}

 

  •  JdbcTemplateScheduleRepository
    • DB에 LocalDateTime의 값을 DATETIME형식으로 변환해줘야했다.
    • TimeStamp.valueOf 메서드를 사용하면 DATETIME형식으로 변환이 가능하다.
    • Map<String, Object> parameters = new HashMap<>(); 로 처리할 경우 Object는 모든 클래스의 상위클래스로 다양한 타입의 값을 저장 할 수 있다.
    • 참고사이트 : https://galid1.tistory.com/566
@Override
    public ScheduleResponseDto saveSchedule(Schedule schedule) {

        // INSERT Query 직접 작성하지 않아도 된다.
        SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
        jdbcInsert.withTableName("schedule").usingGeneratedKeyColumns("id");

        Map<String, Object> parameters = new HashMap<>();
        parameters.put("title", schedule.getTitle());
        parameters.put("start_datetime", Timestamp.valueOf(schedule.getStartDateTime())); // LocalDatetime -> DATETIME -> String형식에는 어떻게..?
        parameters.put("end_datetime", Timestamp.valueOf(schedule.getEndDateTime()));
        parameters.put("description", schedule.getDescription());

        Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));

        return new ScheduleResponseDto(
                key.longValue(),
                schedule.getTitle(),
                schedule.getStartDateTime(),
                schedule.getEndDateTime(),
                schedule.getDescription());

    }

 

  • 왜인지 모르겠는데 intellij가 가끔 먹통이 되는 문제가 있다. 메모리할당도 늘려줬는데 왜 자꾸 멈추는지 모르겠다.
    • 내일 intellij 관련 설정을 알아보고 설정을 변경해야겠다..