전체 글 190

List - ArrayList, LinkedList

1. ADT 관점에서의 List 값을 저장하는 추상 자료형 순서가 있다. 중복을 허용한다. Set, Map을 쓰는 것이 더 적절한 상황이 아니라면 웬만해서는 List를 사용한다. 2. List 구현 (1) Array List Array 형태로 List를 구현한다. 기존 배열의 크기가 다 찼는데 새로운 값을 넣으려고 하면 기존 배열보다 큰 크기의 배열을 만든 후 기존 배열에 있던 값을 새로운 배열에 복사한다. 그리고 새로운 배열에 새로운 값을 집어넣는다. 데이터를 삭제하려면 일단 데이터가 List 안에 있는지 탐색하는데 시간이 1차적으로 걸리고, 데이터가 만약 있다면 해당 자리에 있던 데이터를 지우고 또 data shift가 일어나므로 시간이 2차적으로 소요된다. Array List 안에 있는 값을 탐색하..

Spring Interceptor 알아보기

1. 들어가며 애플리케이션을 개발하다보면 인증을 해야되는 경우가 있습니다. 대표적으로 로그인이 있습니다. 로그인은 웬만한 애플리케이션에 들어가는 필수적인 기능이죠. 인증을 처리하는 방법에는 여러가지가 있습니다. 쿠키, 세션 등을 활용할 수도 있고 서블릿 필터 혹은 Spring Security를 사용할 수도 있습니다. 그러나 이번 포스팅에서는 Spring Interceptor 라는 것에 대해서 작성해보고자 합니다. 2. Spring Interceptor 란? 스프링 인터셉터란 디스패처 서블릿과 컨트롤러 사이에서 작동합니다. 이 말은 즉 스프링 컨테이너 환경 안에서 작동한다는 것을 의미합니다. 이름에서부터 알 수 있듯이 스프링 인터셉터는 Spring 환경에서 작동합니다. 스프링 인터셉터와 유사한 개념으로 서..

TIL 2023.01.26

Spring Rest Docs 커스터마이징하기

1. 들어가며 Spring Rest Docs를 세팅하고 테스트코드를 작성해서 기본적인 API 문서를 만드는데 성공했다면 이제 본인이 원하는대로 API 문서를 커스터마이징 해볼 시간입니다. 이번 포스팅에서는 Spring Rest Docs를 커스터마이징 하는 방법에 대해서 알아보겠습니다. 2. API 마다 별도의 스니펫 디렉토리 만들어주기 여러 개의 API를 만들고 이에 대한 문서화를 진행하고자 한다면 디렉토리를 구분해주는 것이 좋습니다. 이를 위해서는 테스트코드에서 조정이 필요합니다. document( ) 안에 들어가는 파라미터로 어떤 API인지에 대한 identifier를 써주는 것이 좋습니다. identifier에 넣은 이름대로 스니펫 디렉토리가 생성이 됩니다. 테스트코드에서 지정해준 identifie..

TIL 2023.01.25

배열, 동적배열, 연관배열

1. 배열(Array) 같은 타입의 데이터들을 저장하는 자료구조 연속된 메모리 공간에 자료들을 저장 데이터들 각각은 이름은 없지만 인덱스라는 것이 주어져 있어서 인덱스로 데이터에 접근 가능 배열의 인덱스는 0부터 시작한다. 배열에 객체를 저장하는 경우에는 배열에는 객체 참조값이 저장이 된다. 객체 참조값은 연속된 메모리에 저장이 된다. 실제 객체들은 당연히 Heap 메모리에 비연속적으로 저장이 되어있을 것이다. 배열의 장점 연속된 메모리 공간에 데이터를 저장하기 때문에 CPU 캐시를 통해서 같은 배열에 있는 다른 데이터에 접근하는 시간을 단축시킬 수 있다. 2. 동적 배열(Dynamic Array) 크기가 변할 수 있는 배열 데이터를 더하거나 빼는 것이 가능한 자료구조 ex: ArrayList 3. 연관..

정규화

정규화란 무엇인가?? 데이터베이스 정규화의 가장 큰 목표는 테이블 간에 중복된 데이터를 허용하지 않겠다는 것이다. 중복된 데이터를 허용하지 않음으로써 데이터의 무결성을 유지하고 DB 저장 용량도 줄일 수 있다는 장점이 있다. 데이터베이스 정규화를 제대로 공부해두면 이후에 배울 join에 대해서도 쉽게 이해할 수 있다. 데이터 무결성? 데이터의 정확성, 일관성, 유효성이 유지되는 것 정규화에는 3단계가 있다. 제 1 정규화 제 1 정규화를 가장 쉽게 풀이하면 Column 하나에는 하나의 값만 들어가야한다는 것이다. 이를 전문 용어로 표현하면 Column이 원자값(Atomic Value)을 가진다고 한다. 회원번호 회원이름 강좌명 101 장욱 헬스 102 서율 수영 103 낙수 골프 104 세자 헬스 이런 ..

Priority Queue(우선순위큐), Heap(힙)

1. Priority Queue(우선순위 큐) 큐와 유사하지만 우선순위가 높은 아이템이 먼저 처리되는 자료구조 주요 동작 insert: 아이템을 집어넣을 때 우선순위 정보도 같이 넣어줘야한다. delete: 우선순위가 가장 높은걸 제거한다. peek: delete와 유사하지만 실제로 우선순위 큐에서 제거하지는 않는다. 2. Heap(힙) 트리: 부모-자녀처럼 계층적인 형태를 가지는 구조 이진트리: 자녀가 최대 두 개인 트리힙은 주로 이진트리 기반으로 구현된다. Max Heap과 Min Heap 두 가지 종류가 있다. Max Heap: 부모 노드의 key가 자식 노드(들)의 key보다 크거나 같은 트리 Min Heap: 부모 노드의 key가 자식 노드(들)의 key보다 작거나 같은 트리 주요 동작 inse..

Spring Rest Docs 세팅하기!

1. 들어가며 API를 만드는 것도 중요하지만 또 다른 중요한 것이 있습니다. 바로 API 문서를 만드는 것입니다. API를 만드는 목적 자체가 다른 누군가가 사용하기 위해서 만드는 것이기 때문에 API를 어떻게 사용하는지에 대한 API 문서를 만드는 것은 아주 중요한 일입니다. API를 만들기 위해서 사용하는 다양한 툴이 있습니다. 우리나라에서는 Swagger와 Spring Rest Docs를 많이 사용하는 것 같습니다. 각자 일장일단이 있기 때문에 무엇이 더 좋다라고 단정짓기는 어렵습니다. (다만 Spring Rest Docs 자체가 이름에서 Spring이 들어가는 것처럼 Spring 진영에서 좀 더 밀어주는 거 같기도...) Spring Rest Docs는 테스트코드를 작성함으로써 API 문서를 만..

TIL 2023.01.25

페이징 시 Limit과 Offset의 개념

페이징에 관련된 내용을 공부할 때 Limit과 Offset이 자주 등장했는데 정리를 해볼까 합니다. 특히 Offset 개념이 잘 이해가 되지 않아서 공부할 겸 정리를 하면 좋을 것 같습니다. 1. Limit 과 Offset 개념 Limit: 행을 얼마나 가져올지 -> 페이지 당 데이터를 몇 개를 가져올 지 Offset: 어디서부터 가져올지 -> Offset 다음 위치부터 Limit 수만큼 데이터를 가져옴 2. 예제 select 칼럼명 from 테이블명 limit 10 offset 0 이렇게 쿼리를 날리면 1~10까지 출력이 됩니다. limit으로 10을 걸어줬으니 한 페이지 당 데이터는 10개씩 가져오게 되는 것이고, offset 이 0이기 때문에 1부터 10개인 1~10이 출력이 되는 것이죠. 동일한 ..

TIL 2023.01.20

Junit5 테스트코드를 짤 때 주의할 점

1. 배경 테스트코드를 짤 때 주의할 점이라고 거창하게 말했지만 실제로는 제가 오늘 하루 삽질을 한 후기입니다. 결론부터 말하자면.. 주의!!! 테스트 코드의 실행순서는 보장되지 않는다..! 이것을 강의 들을 때 분명히 배웠음에도 기억을 하지 못 하여 엄한데서 삽질을 하였습니다. 2. 문제 상황 강의를 들으며 테스트코드를 작성하고 개별 테스트에서는 테스트통과가 되나 전체 테스트를 돌리면 특정 테스트만 실패함 우선 Controller 쪽 코드는 다음과 같습니다. 페이징과 관련된 코드인데 쿼리는 다음과 같습니다. 이 부분에 관한 테스트 코드는 다음과 같습니다. 여기서 오늘 하루종일 저를 괴롭혔던 부분은 테스트코드에서 id를 검증하는 부분이었습니다. test5를 단독실행하면 늘 항상 통과가 됐는데 전체 테스트..

TIL 2023.01.19

프로세스, 쓰레드, 멀티프로그래밍, 멀티태스킹, 멀티쓰레딩, 멀티프로세싱

1. 사전 배경지식 프로세스 컴퓨터에서 실행 중인 프로그램 각각의 프로세스는 독립된 메모리 공간을 할당받음 각각의 프로세는 명령어와 데이터를 가짐 CPU 명령어를 실행하는 연산장치 메모리 프로세스가 CPU에서 실행되기 위해 대기하는 곳 IO(Input/Output) 파일을 읽고 쓰는 것 네트워크 어딘가와 데이터를 주고 받는 것 입출력 장치와 데이터를 주고 받는 것 2. 단일 프로세스 시스템 한 번에 하나의 프로그램만 실행할 수 있음 CPU 사용률이 좋지 않음 하나의 프로그램(P1)이 CPU 사용이 필요한 작업과 IO 작업을 한다고 가정 P1이 CPU를 사용할 때는 CPU를 사용함 그러다가 P1이 IO 작업을 할 때는 CPU가 가만히 대기하고 있음 사용률 떨어짐 해결책: 여러 개의 프로그램을 동시에 실행..