전체 글 32

[TIL] Docker 컨테이너에 대한 간단한 이해

Docker 가 리눅스 기반에서만 실행될 수 있는 것은 리눅스 OS 에서 제공하는 특별한 기능을 사용하기 때문이다. Docker 가 사용하는 linux 기술에는 여러가지가 있고, 더 깊은 내용들이 있지만 일단은 namespace 와 cgroup에 대해 이해한 내용을 간단히 정리해보려고 한다. 참고 컨테이너를 위한 리눅스 기능: cgroup, namespace, union mount컨테이너 기술의 근간이 되는 Cgroup, Namespace, Union mount에 대해 알아보자.velog.io 결론부터 말하자면, namespace 는 별도의 커널 자원을 분리하는 것이고, Cgroup 은 control group 의 약자로 HW 자원을 분리한 것이다. 커널과 하드웨어 자원을 따로 분리해서 가지기 때문에,..

카테고리 없음 2025.07.16

[TIL] @Embedded

1. VO 와 엔티티 데이터의 형태는 어디에서 이용되는지에 따라 달라진다. Redis 에서는 빠른 접근을 위해 사용 목적에 맞게 sorted set, List, Hash Table 등의 모델에 저장되고, RDB 에서는 영속성과 무결성의 목적에 맞게 테이블의 튜플 형태로 저장된다. application 에서는 비즈니스 로직을 수행하는 과정에서 '의미'가 중요해진다. 그래서 다른 시스템에서는 볼 수 없는 도메인이나 애그리거트라는 개념도 나온다. VO 는 Value Object 로, 돈이나 주소, 전화번호, 일련번호 등등 '값이 같으면 같은 것' 이라는 의미를 갖는 객체이다. Member 라는 객체는 이름이나 나이가 같아도 다른 사람이다. 보이는 값이 같아도 각자 다른 주체로서 구분된다. 반면, VO 의 경우..

카테고리 없음 2025.07.15

[TIL] Gradle-1

1. gradle 이란gradle 이 컴파일, 라이브러리 추가, jar 파일 생성 등의 '어플리케이션 생성' 이라는 일련의 과정을 수행하도록 설정해줄 수 있다. 설정을 해준다면 Gradle 내에서 해당 스크립트를 읽고 실행해준다.Gradle 을 사용하여 build 를 할 때는 2가지 방식이 있는데, 직접 Gradle CLI 를 입력하거나, Gradle Wrapper 를 사용하는 방식이 있다.$gradle build -> os 에 설치된 gradle 버전 사용$./gradlew build -> Gradle Wrapper 를 사용하여, build.gradle 에 지정된 버전을 사용, 공식문서에서 권장 Gradle 공식문서에서 권장하는 것은 Gradle Wrapper를 사용하는 방식이며, gradle 버전을 ..

카테고리 없음 2025.07.13

[TIL] JPA 의 save 동작 방식과 Id 관련

1. merge() 와 persist() 의 차이 jpa merge 란? : 준 영속상태의 엔티티를 영속 상태로 만들거나, 영속 상태의 엔티티를 업데이트하는 연산. persist 란? : 새로 만들어진 엔티티를 영속화시키는 것!그래서 새로운 것이면 persist 만 수행하고, 새로운 것이 아니고 id 가 존재한다면 merge 로 db 에 select 쿼리를 보내 영속성 컨텍스트에 올리게 된다.persist 를 실행하고, db 혹은 1차 캐시에 같은 엔티티가 존재하면, EntityExistsException 에러가 발생한다. * 도대체 언제 detached 가 되는걸끼? - 영속성 컨텍스트 메모리 관리 : managed 이면 더티체킹으로 매우 메모리 낭비가 심해지기 때문에 detached...

카테고리 없음 2025.07.10

[TIL] Redis 에서 CRUD 하기

1. Redis connectionSpringBoot 로 작성한 어플리케이션에서 redis 와 통신하기 위해 사용할 수 있는 방법은 크게 2가지가 있다.1. RedisTemplate2. RedisRepository 1번은 spring data redis 에서 redis client 를 사용하여 java 객체들이 redis 와 연결을 맺고 데이터를 받아올 수 있는 통로같은 객체이다. 1번은 redis 가 제공하는 crud, 캐싱, pub/sub 등 다양한 기능을 사용하기 위해 redis cli 를 java 함수적으로 접근할 수 있게 구현한 것이며, 공식문서에서는 "자바 기반의 serializer 로 데이터를 읽어 직렬화 또는 역직렬화를 한다." 라고 설명하고 있다. redis server 에 대한 정보를 ..

카테고리 없음 2025.07.09

[TIL] JPA 에서 N+1 문제를 해결하는 방법

참고더보기JPA N+1 문제와 해결법 총정리@EntityGraph 와 fetch join 차이 1. N+1 문제란N+1 문제는 다대일 관계에서 지연로딩일 때 발생하는 문제를 말한다.@EntityPublic class Post { @Id @GeneratedValue Private Long id; @OneToMany(mappedBy = “post”, fetch = FetchType.LAZY) Private List commentList = new ArrayList() ;}post 객체는 comment 객체와 일대다 관계를 가지고 있고, 지연 로딩으로 설정되어 있다. 따라서 post 를 조회하는 쿼리가 나갈 때, comment 테이블과 outer join 으로 곧바로 가져오지 않고,..

카테고리 없음 2025.07.08

[백준] 1713 - 후보 추천하기

✅문제 링크 : https://www.acmicpc.net/problem/1713 이 문제는 운영체제에서 프로세스를 정렬할 때 LRU(Least Recently Used) 와 우선순위 큐를 결합한 형태의 정렬과 가깝다. 따라서 우선순위 큐를 가장 쉽게 구현할 수 있는 heap를 사용하였다. heap의 요소로, 후보의 추천 횟수와 후보를 list로 묶어 넣고, is_in(x) 함수를 통해 x 후보가 힙에 있으면 해당 횟수를 1번 증가시키는 방법으로 문제를 해결하였다.  그러나 4% 쯤에서 오답이 나오자, 힙을 출력해봤더니, 가장 오래된 사진을 heappop으로 빼낼 때 heap이 같은 횟수라도 오래된 순서로 정렬되어있지 않다는 문제가 발생했다. 그리고 정렬 방식도 일관되지 못했다. 우선 파이썬의 heapq..

알고리즘 2025.01.08

[백준] 2531 - 회전 초밥

✅문제 링크 : https://www.acmicpc.net/problem/2531 이 문제는 순서대로 k 개의 초밥을 먹을 때, 먹을 수 있는 가장 다양한 초밥의 가짓수를 구하는 문제이다. 다른 복잡한 알고리즘이 쓰이지 않고 순서대로 확인해서 최적의 답을 찾아야 한다. 처음에는 아주 단순하게 d+1을 길이로 하는 visited 배열에 현재의 i부터 i+k 까지의 값에 대해 True를 작성하고 count 함수를 이용해서 True의 개수를 파악했지만, count 함수가 n(d) 의 시간복잡도를 가지기 때문에 반복문에서 거의 n*n 보다 큰 시간 복잡도를 가지게 되었고, '시간 초과'로 실패했다.  따라서 최대한 중복되는 계산을 줄이고자, 슬라이딩을 이용했다.  슬라이딩 윈도우슬라이딩 윈도우 알고리즘은 연속된..

알고리즘 2025.01.07

[백준] 2564 - 경비원

➡️문제 링크 : https://www.acmicpc.net/problem/2564  이 문제는 각 위치의 가게들과의 최소 거리를 구하는 문제이다. 이런 문제는 단순 구현 문제이고, 많은 조건 분기를 요하기 때문에 단순하고 신속하게 푸는 게 핵심이다. 나는 최대한 조건 분기를 줄이고 싶어서 '좌표' 로 만들었다. 좌표로 만들면 두 점의 x와 y 사이의 거리의 합만 구하면 바로 최단 거리가 구해지기 때문이다. 하지만 맞은편 (1은 2, 3과 4)의 두 점만큼은 그렇지 못하다. 이 점을 예외로 두기 위해 d 라는 배열을 만들어서 맞은편인지 여부를 체크하도록 했고, 맞은편에 위치한 가게인 경우라면 따로 계산하도록 했다.   만약 경비원이 남쪽에, 1번 가게가 북쪽에 위치하고 있을 때, 구할 수 있는 경로는 다..

알고리즘 2025.01.07

[백준] 1446 - 지름길

➡️문제 링크 : https://www.acmicpc.net/problem/1446  요즘 dp 문제를 많이 풀고 있어서 문제를 보자마자 dp인 것 같은데..? 라는 생각을 하긴 했지만 10000이라는 큰 수에 dp일리는 없다고 생각했다. 그러나 아무리 머리를 쥐어짜도 dp밖에는 답이 없는 것 같아서 슬며시 '알고리즘 분류'를 내려봤고(최근에 자주 내려보고 있다...ㅠㅠ 실버를 더 다져야 할 듯 하다) 아니나 다를까 dp가 맞았다.  dp로 문제를 풀 수 있다고 생각한 이유는 dp밖에는 이 모든 경우의 수(?)를 다룰 방법이 없어보여서였다. 수가 작다 해도 최대 12개의 지름길을 o,x로 모든 경우의 수를 짐작하기에는 128MB는 적어 보였고, min 값을 계속 갱신하는 방법으로 이 문제를 푸는 게 최선..

알고리즘 2025.01.06