전체 글

CS/데이터베이스

Mariadb / MySQL

이번 프로젝트에서 사용할 DataBase를 선택하기 위해 찾아보고 비교해 보았다! MySQL 가장 널리 사용되고 있는 관계형 데이터베이스 관리 시스템 (RDBMS) 성능과 신뢰성 등에서 꾸준히 개선되어 옴 오픈 소스이며 다중 사용자와 다중 스레드를 지원, 여러 프로그래밍 언어를 위한 API 제공 다양한 운영체제에서 사용 가능 오픈 소스 라이센스를 따르지만, 상업적으로 사용할 때는 상업용 라이센스를 구입해야 함 MariaDB MySQL 데이터베이스 시스템을 기반으로 한 서비스 MySQL의 개선된 버전으로 호환성이 높음 MySQL에서 찾을 수 없는 수많은 내장된 강력한 기능과 많은 유용성, 보안 및 성능 개선사항이 함께 제공 MySQL에 비해 확장성이 뛰어나고 쿼리 속도가 더 빠름 MySQL vs Maria..

Spring Boot

API 예외 처리

HTML 페이지 vs API 오류 HTML 페이지 BasicErrorController 는 HTML 페이지를 제공하는 경우에는 매우 편리 (4xx, 5xx) API 오류 API 마다, 각각의 컨트롤러나 예외마다 서로 다른 응답 결과를 출력해야 할 수 있음 API 오류 처리는 뒤에서 설명할 @ExceptionHandler 를 사용 스프링 부트가 기본으로 제공하는 ExceptionResolver ExceptionHandlerExceptionResolver @ExceptionHandler 을 처리 API 예외 처리는 대부분 이 기능으로 해결 ResponseStatusExceptionResolver HTTP 상태 코드를 지정 @ResponseStatus 가 달려있는 예외 처리 (@ResponseStatus(va..

Spring Boot

서블릿 필터, 스프링 인터셉터

필터 흐름 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러// 로그인 사용자 HTTP 요청 -> WAS -> 필터(적절하지 않은 요청이라 판단, 서블릿 호출X) // 비 로그인 사용자 init(): 필터 초기화 메서드, 서블릿 컨테이너가 생성될 때 호출 doFilter(): 고객의 요청이 올 때 마다 해당 메서드가 호출 (필터 로직을 구현) destroy(): 필터 종료 메서드, 서블릿 컨테이너가 종료될 때 호출 서블릿 필터 인증 체크 필터 개발 // 필터를 사용하려면 필터 인터페이스를 구현해야 함 @Slf4j public class LoginCheckFilter implements Filter { // 화이트 리스트를 제외한 나머지 모든 경로에 인증 체크 로직을 적용 private st..

Spring Boot

쿠키, 세션 - 스프링 적용

HTTP 프로토콜 환경은 connectionless, stateless한 특성을 가짐 (통신이 끝나면 상태 정보를 유지하지 않음) Connectionless 클라이언트가 서버에 요청(Request)을 했을 때, 그 요청에 맞는 응답(Response)을 보낸 후 연결을 끊음 Stateless 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나고 상태 정보를 유지하지 않음 쿠키와 세션을 사용하여 사용자에 대한 인증 유지 필요 쿠키 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일 사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증 유지 이름, 값, 만료일, 경로 정보로 구성 클라이언트 로컬에 저장되기 때문에 변질되거나 request에서 스니..

CS/알고리즘

해시(Hash) - Dictionary

Dictionary 인덱스를 숫자가 아닌 문자열, 튜플을 사용하려 할 때 빠른 접근/탐색이 필요할 때 집계가 필요할 때 (원소의 개수를 세는 문제) Dictionary와 list의 시간 복잡도 차이 Operation Dictionary List Get Item O(1) O(1) Insert Item O(1) O(1) ~ O(N) Update Item O(1) O(1) Delete Item O(1) O(1) ~ O(N) Search Item O(1) O(N) 원소를 넣거나 삭제, 찾는 일이 많을 때에는 딕셔너리를 사용 Dictionary 생성 # 빈딕셔너리 생성 dict1 = {} # {} dict2 = dict() # {} Dictionary 원소 가져오기 # [] 기호 사용해 원소 가져오기 dict =..

Spring Boot

Validation

BindingResult 스프링이 제공하는 검증 오류를 보관하는 객체 BindingResult가 있으면 @ModelAttribute에 데이터 바인딩 시 오류가 발생해도 컨트롤러가 호출됨 검증할 대상 바로 다음에 와야함 ex) @ModelAttribute Item item , BindingResult bindingResult FieldError 가격에 숫자가 아닌 문자가 입력될 때 문자를 보관할 방법이 없음 → FieldError가 오류 발생시 사용자 입력 값 저장 objectName : 오류가 발생한 객체 이름 field : 오류 필드 rejectedValue : 사용자가 입력한 값(거절된 값) - 오류 발생시 사용자 입력 값을 저장하는 필드 bindingFailure : 타입 오류 같은 바인딩 실패인지..

Spring Boot

Thymeleaf - 스프링 통합과 폼

입력 폼 처리 th:object : 커맨드 객체를 지정 *{...} : 선택 변수 식 → th:object 에서 선택한 객체에 접근 th:field HTML 태그의 id , name , value 속성을 자동으로 처리 상품 ID th:object="${item}" : 에서 사용할 객체를 지정 th:field="*{itemName}" (선택 변수 식 사용) th:field는 id , name , value 속성을 모두 자동으로 만들어줌 체크 박스 판매 여부 판매 오픈 타임리프를 사용하면 체크 박스의 히든 필드와 관련된 부분도 함께 해결 disabled를 사용해서 상품 상세에서는 체크 박스가 선택되지 않도록 함 th:field를 사용하면, 값이 true인 경우 체크를 자동으로 처리 → checked="che..

Spring Boot

Thymeleaf 기본 기능

텍스트 출력 - text, utext // HTML의 콘텐츠(content)에 데이터 출력 [[${data}]]// HTML 콘텐츠 영역 안에서 직접 데이터 출력 타임리프가 제공하는 th:text , [[...]] 는 기본적으로 이스케이스(escape)를 제공 ex) → > Unescape (꼭 필요할 때만 사용) th:text → th:utext [[...]] → [(...)] 변수 - SpringEL 변수 표현식: ${...} Object user.username : user의 username을 프로퍼티 접근 user['username'] : 위와 같음 user.getUsername() List users[0].username : List에서 첫 번째 회원을 찾고 username 프로퍼티 접근 use..

Spring Boot

Thymeleaf

타임리프 사용 선언 속성 변경 - th:href th:href="@{/css/bootstrap.min.css}" href="value1"을 th:href="value2"의 값으로 변경 HTML을 그대로 볼 때는 href 속성이 사용되고, 뷰 템플릿을 거치면 th:href 의 값이 href 로 대체되면서 동적으로 변경 속성 변경 - th:onclick onclick="location.href='addForm.html'" th:onclick="|location.href='@{/basic/items/add}'|" 리터럴 대체 - |...| 타임리프에서 문자와 표현식 등은 분리되어 있기 때문에 더해서 사용해야 함 리터럴 대체 문법을 사용하면, 더하기 없이 편리하게 사용 가능 반복 출력 - th:each 모델에 ..

Spring Boot

Spring Boot - MVC 기능

@RestController @Controller는 반환 값이 String 이면 뷰 이름으로 인식됨 → 뷰를 찾고 뷰가 랜더링 됨 @RestController는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 입력함 해당 컨트롤러에 모두 @ResponseBody가 적용 - Rest API(HTTP API)를 만들 때 사용하는 컨트롤러 @RequestMapping("/xx") /xx URL 호출이 오면 이 메서드가 실행되도록 매핑 대부분의 속성을 배열로 제공하므로 다중 설정 가능 PathVariable(경로 변수) 사용 @GetMapping("/mapping/{userId}") public String mappingPath(@PathVariable("userId") String data)..

koeyhk
개발 블로그