오늘 진행한 학습 요약
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)하고 필터링하여 해결, 외부 보안관련 라이브러리를 사용, 보안 솔루션을 사용
- SQL Injection
- 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 관련 설정을 알아보고 설정을 변경해야겠다..