2025/01/19 8

[Spring/DB] 02. 커넥션풀과 데이터소스 이해

02. 커넥션풀과 데이터소스 이해정리이전 챕터에서 학습한 코드의 동작 방식에는 한 가지 큰 문제점이 있다. 쿼리를 날릴 때 마다 커넥션을 매번 획득한다는 점이다.데이터베이스 커넥션을 획득할 때는 복잡한 과정을 거친다.애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다.DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. 물론 이 과정에서 3 way handshake 같은 TCP/IP 연결을 위한 네트워크 동작이 발생한다.DB 드라이버는 TCP/IP 커넥션이 연결되면 ID, PW와 기타 부가정보를 DB에 전달한다.DB는 ID, PW를 통해 내부 인증을 완료하고, 내부에 DB 세션을 생성한다.DB는 커넥션 생성이 완료되었다는 응답을 보낸다.DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다..

Spring/DB 2025.01.19

[Java] 32. Set

Set#Java자바가 제공하는 Set1 - HashSet, LinkedHashSet자바의 Set 인터페이스는 java.util 패키지의 컬렉션 프레임워크에 속하는 인터페이스 중 하나이다. Set 인터페이스는 중복을 허용하지 않는 유일한 요소의 집합을 나타낸다. 그러다보니, 특정 요소가 집합에 있는지 여부를 확인하는데 최적화되어 있다.Set 인터페이스는 HashSet , LinkedHashSet , TreeSet 등의 여러 구현 클래스를 가지고 있으며, 각 클래스는 Set 인터페이스를 구현하며 각각의 특성을 가지고 있다.주요 메서드add(E e) 지정된 요소를 세트에 추가한다(이미 존재하는 경우 추가하지 않음).addAll(Collection c) 지정된 컬렉션의 모든 요소를 세트에 추가한다.contain..

[Java] 31. HashSet

HashSet#Java이전 챕터에 처음 정의했던 Set의 성능을 해시 알고리즘을 통해 평균 O(1)으로 개선해보자.MyHashSetV1단순히 해시 인덱스를 다음과 같은 방법으로 구한다.public class MyHashSetV1 { static final int DEFAULT_INITIAL_CAPACITY = 16; LinkedList[] buckets; private int size = 0; private int capacity = DEFAULT_INITIAL_CAPACITY; public MyHashSetV1() { initBuckets(); } public MyHashSetV1(int capacity) { this.capacity = capacity; initBuckets(); } privat..

[Java] 30. Hash

Hash#JavaSet이란?세트(셋)는 유일한 요소들의 컬렉션특징중복된 요소가 존재하지 않음순서를 보장하지 않는다.빠른 검색: 요소의 유무를 빠르게 확인할 수 있도록 최적화되어 있다.용도: 중복을 허용하지 않고, 요소의 유무만 중요한 경우에 사용예시:List: 장바구니 목록, 순서가 중요한 일련의 이벤트 목록.Set: 회원 ID 집합, 고유한 항목의 집합.셋 직접 구현하기단순히 배열에다가 추가하는 방식을 생각해보자.메서드add(value) : 셋에 중복된 값이 있는지 체크하고, 중복된 값이 있으면 false 를 반환한다. 중복된 값이 없으면 값을 저장하고 true 를 반환한다.contains(value) : 셋에 값이 있는지 확인한다. 값이 있으면 true 를 반환하고, 값이 없으면 false 를 반환한..

[Java] 29. 컬렉션- ArrayList, LinkedList, List

컬렉션- ArrayList, LinkedList, List#JavaC 스타일 배열데이터 조회배열의 인덱스 사용: O(1)배열의 순차 검색: O(n)데이터 추가배열의 첫번째 위치에 추가배열의 첫번째 위치를 찾는데는 인덱스를 사용하므로 O(1)이 걸린다.모든 데이터를 배열의 크기만큼 한 칸씩 이동해야 한다. 따라서 O(n) 만큼의 연산이 걸린다.O(1 + n) O(n)이 된다.배열의 중간 위치에 추가배열의 위치를 찾는데는 O(1)이 걸린다.index의 오른쪽에 있는 데이터를 모두 한 칸씩 이동해야 한다. 따라서 평균 연산은 O(n/2)이 된다.O(1 + n/2) O(n)이 된다.배열의 마지막 위치에 추가이 경우 배열이 이동하지 않고 배열의 길이를 사용하면 마지막 인덱스에 바로 접근할 수 있으므로 한번..

[Spring/MVC] 12. Bean Validation

12. Bean Validaiton정리이전 챕터에서 검증 로직을 스프링 Validator를 구현하여 처리하는 방법까지 살펴봤다. 그런데, 매 번 코드로 검증 로직을 작성하는 것은 상당히 번거롭다. 특히 특정 필드에 대한 검증 로직은 대부분 빈 값인지 아닌지, 특정 크기를 넘는지 아닌지와 같이 매우 일반적인 로직이다.이런 검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고, 표준화 한 것이 바로 Bean Validation 이다.public class Item { private Long id; @NotBlank(message = "공백 X") // 이런 식으로 메시지를 지정할 수도 있다. private String itemName; @NotNull @Range(min = 1000, max = 10000..

Spring/MVC 2025.01.19

[Spring/MVC] 11. Validation

11. Validation주의) 이번 챕터의 정리 글은 매우 깁니다~정리폼 입력 시 숫자를 문자로 작성하거나 해서 검증 오류가 발생하면 오류 화면으로 바로 이동한다. 이렇게 되면 사용자는 처음부터 해당 폼으로 다시 이동해서 입력을 해야 한다. 웹 서비스는 폼 입력 시 오류가 발생하면, 고객이 입력한 데이터를 유지한 상태로 어떤 오류가 발생했는지 친절하게 알려주어야 한다.참고: 클라이언트 검증, 서버 검증클라이언트 검증은 조작할 수 있으므로 보안에 취약하다.서버만으로 검증하면, 즉각적인 고객 사용성이 부족해진다.둘을 적절히 섞어서 사용하되, 최종적으로 서버 검증은 필수API 방식을 사용하면 API 스펙을 잘 정의해서 검증 오류를 API 응답 결과에 잘 남겨주어야 함상품 저장 Validation 실패사용자가..

Spring/MVC 2025.01.19

[Spring/MVC] 10. 메시지 국제화

10. 메시지 국제화정리메시지악덕? 기획자가 화면에 보이는 문구가 마음에 들지 않는다고, 상품명이라는 단어를 모두 상품이름으로 고쳐달라고 한다. “상품명”이라는 메시지가 하드코딩되어 있다면, 여러 HTML 파일에 흩어져있는 “상품명”을 직접 일일히 찾아서 “상품이름”으로 수정해야 할 것이다.이런 다양한 메시지를 한 곳에서 관리하도록 하는 기능을 메시지 기능이라 한다.예를 들어서 messages.properties라는 메시지 관리용 파일을 만들고item=상품item.id=상품 IDitem.itemName=상품명item.price=가격item.quantity=수량각 HTML들은 다음과 같이 해당 데이터를 key 값으로 불러서 사용하는 것이다.국제화메시지의 기능을 조금 더 확장해서 생각해보면, 메시지 파일을 ..

Spring/MVC 2025.01.19