전체 글 44

[Spring Test] 파일 업로드 컨트롤러 테스트 (File + Text)

✨ 기존 - 기존 컨트롤러 테스트에서는 get or post 방식의 request를 생성하기 위해 MockMvcResultBuilders의 get(), post() 메서드를 이용하였다. String body = objectMapper.writeValueAsString(dto); ResultActions perform = mockMvc.perform(post("/boards") .contentType(MediaType.APPLICATION_JSON) .locale(Locale.KOREA) .content(body)); // ControllerTest perform.andDo(print()) .andExpect(status().isBadRequest()) .andExpect(content().contentT..

Spring/Test 2024.03.03

[Spring] MultipartFile

✨ 개념 - 스프링에서 제공하는 MultipartFile 인터페이스를 통해 파일을 업로드할 수 있다. - 같은 파일 이름이 들어오면 충돌이 일어날 수 있으니 파일 이름은 UUID를 사용하는게 좋다 cf) UUID : 해당 타입의 다른 모든 리소스 중에서 리소스를 고유하게 식별하는 데 사용되는 레이블 ✨ 예시 FileService.java @Service public class FileService { public void fileUpload(MultipartFile multipartFile) { // 저장 로직 -> 더 공부 FileController.java public class FileController { private FileService fileService; @PostMapping("/upl..

Spring 2024.02.27

[Algorithm] 계수 정렬

`이것이 코딩 테스트다 (나동빈)` 커리큘럼에 따라 진행합니다 ✨ 계수 정렬 정의 - 매우 빠르게 동작하지만 특정한 조건이 부합할 때만 사용이 가능하다. - 데이터의 크기 범위가 제한되어 정수 형태로 표현할 수 있을 때 사용 가능 - 데이터의 개수가 N, 데이터 (양수) 중 최댓값이 K일 때, 최악의 경우에도 수행 시간이 O(N+K)를 보장한다 동작 방식 1. 가장 작은 데이터부터 가장 큰 데이터까지의 범위가 모두 담길 수 있도록 리스트를 생성 -> 정렬할 데이터의 가장 작은 데이터가 0이고, 가장 큰 데이터가 9이면, 0부터 9까지의 리스트를 생성한다 2. 데이터를 하나씩 돌면서 데이터와 동일한 인덱스에 데이터가 몇 번 등장했는지 개수를 센다. 시간 복잡도 - O(N+K) - 때에 따라 심각한 비효율성..

[Algorithm] 퀵 정렬

`이것이 코딩 테스트다 (나동빈)` 커리큘럼에 따라 진행합니다 ✨ 퀵 정렬 정의 - 기준 데이터를 설정하고 그 기준보다 큰 데이터와 작은 데이터의 위치를 바꾸는 방법 - 일반적인 상황에서 가장 많이 사용되는 정렬 알고리즘 중 하나 - 가장 기본적인 퀵 정렬은 첫 번째 데이터를 기준 데이터 (Pivot)로 설정한다 방식 1. 피벗의 값을 설정한다 (대부분 첫 번째 데이터를 기준으로 함) 2. 왼쪽에서부터 피벗보다 큰 데이터를 고르고, 오른쪽에서부터는 피벗보다 작은 데이터를 고른다 3. 위치가 엇갈리는 경우 (왼쪽과 오른쪽으로 접근하다가 왼쪽에서 선택한 값이 오른쪽이 되고, 오른쪽에서 선택한 값이 왼쪽이 되는 경우) 피벗과 작은 데이터의 위치를 서로 변경한다 4. 분할 완료 후 다시 반으로 나눈 데이터들에 ..

[Algorithm] 삽입 정렬

`이것이 코딩 테스트다 (나동빈)` 커리큘럼에 따라 진행합니다 ✨ 삽입 정렬 정의 - 처리되지 않은 데이터를 하나씩 골라 적절한 위치에 삽입 - 선택 정렬에 비해 구현 난이도가 높은 편이지만, 일반적으로 더 효율적으로 동작한다. - 앞쪽의 원소들이 이미 정리되어 있다고 가정하고 뒤쪽에 있는 원소를 적절한 위치에 삽입한다. 예시 import java.util.*; public class Main { public static void main(String[] args) { int n=10; int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8}; for (int i=1; i0; j--) { if (arr[j] < arr[j-1]) { int temp = arr[j]; arr[j] = a..

[Algorithm] 선택 정렬

`이것이 코딩 테스트다 (나동빈)` 커리큘럼에 따라 진행합니다 ✨ 정렬 정의 - 데이터를 특정한 기준에 따라 순서대로 나열하는 것 - 일반적으로 문제 상황에 따라 적절한 정렬 알고리즘이 공식처럼 사용된다 ✨ 선택 정렬 정의 - 처리되지 않은 데이터 중에서 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸는 것을 반복하는 정렬 - 이중 반복문을 사용해 가장 작은 원소 확인 -> 데이터 교환의 과정을 반복한다 시간 복잡도 - N번 만큼 가장 작은 수를 찾아 맨 앞으로 보내야 하므로 O(N^2) 만큼의 시간이 소요된다 - N + (N-1) + (N-2) + ... + 2 => (N^2 + N - 2) / 2 ✨ 문제 - 선택 정렬을 사용하지 않지만... 접근 - 좌표 Xi보다 작은 값이 몇 개 있는지 구..

[Algorithm] DFS & BFS 알고리즘

`이것이 코딩 테스트다 (나동빈)` 커리큘럼에 따라 진행합니다 ✨ DFS 정의 - DFS (깊이 우선 탐색) : 깊은 부분을 우선적으로 탐색하는 알고리즘 - 스택 자료구조 또는 재귀 함수를 이용해 문제를 푼다 동작 과정 1. 탐색 시작 노드를 스택에 삽입하고 방문 처리 2. 스택의 최상단 노드에 방문하지 않은 인접한 노드가 하나라도 있으면 그 노드를 스택에 넣고 방문 처리 -> 방문하지 않은 인접 노드가 없을 경우 스택에서 최상단 노드를 꺼낸다 -> 최상단 노드를 기준으로 깊은 부분을 탐색 3. 더 이상 2번의 과정을 수행할 수 없을 때까지 반복 예시 def dfs(graph, v, visited): visited[v] = True print(v, end=' ') for i in graph[v]: if ..

[Algorithm] 재귀 함수

`이것이 코딩 테스트다 (나동빈)` 커리큘럼에 따라 진행합니다 ✨ 개념 - 재귀 함수 : 자기 자신을 다시 호출하는 함수 - dfs를 실제로 구현할 때 자주 사용하므로 제대로 이해하고 넘어가는게 좋다 - 문제를 풀 때는 재귀 함수의 종료 조건을 반드시 명시해야 한다 ✨ 문제 24060번: 알고리즘 수업 - 병합 정렬 1 첫째 줄에 배열 A의 크기 N(5 ≤ N ≤ 500,000), 저장 횟수 K(1 ≤ K ≤ 108)가 주어진다. 다음 줄에 서로 다른 배열 A의 원소 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 109) www.acmicpc.net 조건 1. N개의 서로 다른 양의 정수가 저장된 배열 A 2. 병합 정렬로 배열 A를 오름차순 정렬 3. 배열 A에 저장되는 K번째 수 구하기 ..

[Spring] 웹 서버, 웹 애플리케이션 서버

`스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (김영한)` 강의를 듣고 정리한 자료입니다 ✨ 통신 - 데이터를 주고 받는 경우 대부분 `HTTP` 메시지에 모든 것을 전송한다 ✨ 웹 웹 서버 - HTTP 프로토콜로 응답을 주고 받는다 - ex) NGINX, APACHE 웹 애플리케이션 서버 (WAS) - 웹 서버 기능 + 정적 리소스 제공 가능 - ex) 톰캣, Jetty, Undertow - 사용자에 따라 다른 화면을 보여주는 것이 가능하다 - 서블릿, JSP 등이 WAS에서 동작 ✨ 웹 시스템 구성 - 클라이언트 -> Web Server(정적 리소스 등) -> WAS (애플리케이션 로직) ✨ 서블릿 사용 이유 - 비즈니스 로직 하나를 구현하는데 너무 많은 시간과 노력이 들어간다 -> ex) 소켓..

Spring/MVC 2024.01.19

[Spring] 스프링과 MySQL 연동, MySQL 기본 문법

✨ 순서 1. dependencies에 mysql 추가 - implementation 'mysql:mysq-connector-java:8.0.32' 2. mysql db 생성 (cmd) - mysql-u root -p - 비밀번호 입력 - create database [데이터베이스명]; - show databases;로 생성 확인 - mysql:// [데이터베이스 URL] : [포트 번호] / [데이터베이스 이름]?serverTimezone=UTC 주의 - '-'이 들어간 데이터베이스명은 백틱(`) 없이는 인식이 안 된다 - 따옴표로 하지 말고 백틱으로 하자! spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql:/..

Spring 2024.01.19