전체 글
-
꿈 아니었구요. 안녕하세요. 문제는 그렇게 시작됐습니다. 저희 서비스는 포인트 획득 / 소비 기능을 비관적 락인 네임드 락을 통해 관리하고 있는데요 Facade 계층으로 코드 갈아엎기안녕하세요. 문제는 그렇게 시작됐습니다. @Transactionalpublic void saveComment(String userId, Long diaryId, CommentRequest commentRequest) { Member member = getMember(userId); Diary diary = getDiary(diaryId); List acceptedMembers = friendChdockerel.tistory.com내용이 궁금하시면 위 글을 읽어보시면 됩니다. 근데 저는 이 네임드 락과 이벤트 기반 비동기 처리..
포인트 보정 배치? 트랜잭션 최적화? 너 꿈꿨니?꿈 아니었구요. 안녕하세요. 문제는 그렇게 시작됐습니다. 저희 서비스는 포인트 획득 / 소비 기능을 비관적 락인 네임드 락을 통해 관리하고 있는데요 Facade 계층으로 코드 갈아엎기안녕하세요. 문제는 그렇게 시작됐습니다. @Transactionalpublic void saveComment(String userId, Long diaryId, CommentRequest commentRequest) { Member member = getMember(userId); Diary diary = getDiary(diaryId); List acceptedMembers = friendChdockerel.tistory.com내용이 궁금하시면 위 글을 읽어보시면 됩니다. 근데 저는 이 네임드 락과 이벤트 기반 비동기 처리..
2025.07.31 -
안녕하세요. 문제는 그렇게 시작됐습니다. @Transactionalpublic void saveComment(String userId, Long diaryId, CommentRequest commentRequest) { Member member = getMember(userId); Diary diary = getDiary(diaryId); List acceptedMembers = friendCheckService.getFriendMembers(diary.getMember().getUserId()); if (!diary.isWriter(member) && !acceptedMembers.contains(member)) { throw new UnauthorizedExcepti..
Facade 계층으로 코드 갈아엎기안녕하세요. 문제는 그렇게 시작됐습니다. @Transactionalpublic void saveComment(String userId, Long diaryId, CommentRequest commentRequest) { Member member = getMember(userId); Diary diary = getDiary(diaryId); List acceptedMembers = friendCheckService.getFriendMembers(diary.getMember().getUserId()); if (!diary.isWriter(member) && !acceptedMembers.contains(member)) { throw new UnauthorizedExcepti..
2025.07.30 -
한 학기동안 열심히 후꾸루마꾸루 프로젝트를 말았는데요. 끝나고 나니까 개선할게 좀 보이더라구요. 저희 AI 기반 감정 케어 다이어리 서비스인 "토닥"은 포인트 로그를 조회할 수 있습니다. 포인트는 출석해도 주고, 일기 써도 주고, 댓글 써도 주고사용은 나무 성장 시킬 때 쓸 수 있습니다. 그만큼 분류 기준이 많은데, 로그가 많아지면 사용자가 분류기준으로 검색했을 때 시간이 좀 오래 걸릴 거 같더라구요. MySQL로 EXPLAIN 분석해보니 역시나 조회하려 하면 Full Table Scan이 발생하네요.비용이 상당합니다 아주. 근데 지금 로그에 여러 칼럼이 있습니다.user_id, point_type, point_status, created_at 이 있는데, 어떤 순서로 복합 인덱스를 적용해야할까요? ..
이건 첫 번째 레슨, 복합 인덱스 쓰기한 학기동안 열심히 후꾸루마꾸루 프로젝트를 말았는데요. 끝나고 나니까 개선할게 좀 보이더라구요. 저희 AI 기반 감정 케어 다이어리 서비스인 "토닥"은 포인트 로그를 조회할 수 있습니다. 포인트는 출석해도 주고, 일기 써도 주고, 댓글 써도 주고사용은 나무 성장 시킬 때 쓸 수 있습니다. 그만큼 분류 기준이 많은데, 로그가 많아지면 사용자가 분류기준으로 검색했을 때 시간이 좀 오래 걸릴 거 같더라구요. MySQL로 EXPLAIN 분석해보니 역시나 조회하려 하면 Full Table Scan이 발생하네요.비용이 상당합니다 아주. 근데 지금 로그에 여러 칼럼이 있습니다.user_id, point_type, point_status, created_at 이 있는데, 어떤 순서로 복합 인덱스를 적용해야할까요? ..
2025.07.29 -
작년 이맘때쯤에 스프링을 처음 배우면서 AOP를 사용해 봤던 기억이 났습니다. 경북대 BE_도기헌 6주차 과제(3단계) by Dockerel · Pull Request #335 · kakao-tech-campus-2nd-step2/spring-gift-point안녕하세요! 이번 3단계 과제는 포인트 추가하기였습니다. 과제 요구 조건에 따라 관리자 페이지에서 포인트 충전 기능 및 주문 시 포인트 사용 기능 추가하였습니다. 이때 admin만 포인트 충전을github.com이게 맞나 싶은 AOP 사용 사실 뭐 틀린게 어딨겠냐 싶긴 한데 뭔가... 뭔가네요. 가독성도 별로고 ProductService와 강한 결합도를 가지고 있어 나중에 유지보수하기도 힘들어질 것 같습니다. 하여튼 이번에 AOP를 사용하게 된..
커스텀 어노테이션과 AOP 사용해서 공통기능 처리하기작년 이맘때쯤에 스프링을 처음 배우면서 AOP를 사용해 봤던 기억이 났습니다. 경북대 BE_도기헌 6주차 과제(3단계) by Dockerel · Pull Request #335 · kakao-tech-campus-2nd-step2/spring-gift-point안녕하세요! 이번 3단계 과제는 포인트 추가하기였습니다. 과제 요구 조건에 따라 관리자 페이지에서 포인트 충전 기능 및 주문 시 포인트 사용 기능 추가하였습니다. 이때 admin만 포인트 충전을github.com이게 맞나 싶은 AOP 사용 사실 뭐 틀린게 어딨겠냐 싶긴 한데 뭔가... 뭔가네요. 가독성도 별로고 ProductService와 강한 결합도를 가지고 있어 나중에 유지보수하기도 힘들어질 것 같습니다. 하여튼 이번에 AOP를 사용하게 된..
2025.06.30 -
안할래 농담이고요. 해결기 보시죠. 레지고 문제는 그렇게 발생했습니다. 일단 엔티티간 연관관계부터 보시죠. 지금 개발하고 있는 챗봇 서비스는 회원 한명이 여러 히스토리를, 히스토리 하나가 여러 질문을, 한 질문에는 하나의 답변이, 하나의 답변에는 여러 이미지가 딸려있는 괴랄한 구조를 가집니다. 쉽게 생각하자면 지피티의 구조를 생각하시면 될 것 같습니다. 그래서 회원이 저 히스토리를 딱 클릭하면 히스토리 정보와 거기에 딸린 질문, 답변, 그리고 이미지를 다 불러와야 할 것 같은데요. 연관관계를 다 Lazy Loading으로 설정해놓았기 때문에 그냥 사용했다가는 N+1 폭격을 맞을 것 같네요. 그래서 시원하게 fetch로 다 묶어버렸습니다. public interface HistoryRepository e..
MultipleBagFetchException 해결할래 말래안할래 농담이고요. 해결기 보시죠. 레지고 문제는 그렇게 발생했습니다. 일단 엔티티간 연관관계부터 보시죠. 지금 개발하고 있는 챗봇 서비스는 회원 한명이 여러 히스토리를, 히스토리 하나가 여러 질문을, 한 질문에는 하나의 답변이, 하나의 답변에는 여러 이미지가 딸려있는 괴랄한 구조를 가집니다. 쉽게 생각하자면 지피티의 구조를 생각하시면 될 것 같습니다. 그래서 회원이 저 히스토리를 딱 클릭하면 히스토리 정보와 거기에 딸린 질문, 답변, 그리고 이미지를 다 불러와야 할 것 같은데요. 연관관계를 다 Lazy Loading으로 설정해놓았기 때문에 그냥 사용했다가는 N+1 폭격을 맞을 것 같네요. 그래서 시원하게 fetch로 다 묶어버렸습니다. public interface HistoryRepository e..
2025.06.28 -
프로세스와 스레드란? 프로세스는 운영체제 안에서 실행 중인 프로그램을 뜻하며 다르게 말하면 프로세스는 실행 중인 프로그램의 인스턴스이다. 이때 각 프로세스는 독립적인 작업공간을 가지며 서로 격리되어 관리되기 때문에 서로 영향을 미치지 않는다. 즉 프로세스 A에 심각한 문제가 발생해도 프로세스 B에는 영향을 주지 않는다. 프로세스는 코드 영역, 힙(메모리) 영역, 스택 영역, 그리고 기타(데이터) 영역으로 나뉜다. 코드 영역은 실행할 프로그램의 코드가 저장되는 부분, 힙 영역은 동적으로 할당되는 메모리 영역, 스택은 메서드 호출 시 생성되는 지역 변수 및 반환 주소가 저장되는 영역 그리고 데이터 영역은 전역 및 정적 변수(static)가 저장되는 부분이다. 스레드는 프로세스 내에서 실행되는 작업의 단위로..
프로세스와 스레드 : 컨텍스트 스위칭에 대해프로세스와 스레드란? 프로세스는 운영체제 안에서 실행 중인 프로그램을 뜻하며 다르게 말하면 프로세스는 실행 중인 프로그램의 인스턴스이다. 이때 각 프로세스는 독립적인 작업공간을 가지며 서로 격리되어 관리되기 때문에 서로 영향을 미치지 않는다. 즉 프로세스 A에 심각한 문제가 발생해도 프로세스 B에는 영향을 주지 않는다. 프로세스는 코드 영역, 힙(메모리) 영역, 스택 영역, 그리고 기타(데이터) 영역으로 나뉜다. 코드 영역은 실행할 프로그램의 코드가 저장되는 부분, 힙 영역은 동적으로 할당되는 메모리 영역, 스택은 메서드 호출 시 생성되는 지역 변수 및 반환 주소가 저장되는 영역 그리고 데이터 영역은 전역 및 정적 변수(static)가 저장되는 부분이다. 스레드는 프로세스 내에서 실행되는 작업의 단위로..
2025.03.03 -
올해 초부터 블로그를 좀 열심히 쓰고 있는데, 아직 24년에 대한 회고를 하지 않아 가볍게 지난 1년 그리고 이번 겨울방학에 뭘 했는지, 그리고 KPT 방식으로 리뷰를 한번 해보려고 한다. 24년 3월 개강 전, 2월에 졸업을 위한 토익 시험을 쳤었다. 대략 2주 동안 매일 도서관에 출퇴근하며 토익 문제집을 풀었던 기억이 난다. 정말 이때 영어를 너무 오랜만에 해서 문법도 기억이 안 나고 많은 고난이 있었다. 이때 영어가 부족하단걸 알아차렸어야 하는데... 아무튼, 그래도 옛날 영어했던 짬바가 좀 있어서인지 생각보다 점수가 잘 나왔다. LC 470에 RC 390으로 총 860이 나왔었는데, 역시 RC가 많이 부족... 하다고 생각이 된다. 아무래도 문법 때문인 듯. 그리고 이때까지만 해도 진로가 확실히 ..
열정 가득했던 2024년, 하이라이트와 반성점 회고해보기올해 초부터 블로그를 좀 열심히 쓰고 있는데, 아직 24년에 대한 회고를 하지 않아 가볍게 지난 1년 그리고 이번 겨울방학에 뭘 했는지, 그리고 KPT 방식으로 리뷰를 한번 해보려고 한다. 24년 3월 개강 전, 2월에 졸업을 위한 토익 시험을 쳤었다. 대략 2주 동안 매일 도서관에 출퇴근하며 토익 문제집을 풀었던 기억이 난다. 정말 이때 영어를 너무 오랜만에 해서 문법도 기억이 안 나고 많은 고난이 있었다. 이때 영어가 부족하단걸 알아차렸어야 하는데... 아무튼, 그래도 옛날 영어했던 짬바가 좀 있어서인지 생각보다 점수가 잘 나왔다. LC 470에 RC 390으로 총 860이 나왔었는데, 역시 RC가 많이 부족... 하다고 생각이 된다. 아무래도 문법 때문인 듯. 그리고 이때까지만 해도 진로가 확실히 ..
2025.03.02 -
일단 메모이제이션을 통한 dp가 생각나긴 했는데 지금 방문가능한 오락실이 오름차순으로 허용되고, 또 방문 횟수에 따라 출력을 해야 하기 때문에 dp 배열을 몇 차원으로, 어떻게 관리를 해줘야 할지 고민을 많이 했다. 지금 그런데 좌표의 제한이 50이고 오락실 번호도 그리고 방문 가능한 횟수의 제한도 50이기 때문에 이 모든 정보(y, x, 방문 횟수, 이전에 방문한 오락실 번호)를 다 넣어서 4차원 배열을 사용해 보기로 했다. 어차피 뭐 다 해봤자 50^4=6250000 이니까... int dp[54][54][54][54]; // y,x,최근에 방문한 오락실 번호,지난 오락실 수 일단 초기에 값을 받으며 dp 테이블을 세팅해 주는 작업을 진행하였다. void init() { cin >> n >> m ..
백준 1513 - 경로 찾기 (C++)일단 메모이제이션을 통한 dp가 생각나긴 했는데 지금 방문가능한 오락실이 오름차순으로 허용되고, 또 방문 횟수에 따라 출력을 해야 하기 때문에 dp 배열을 몇 차원으로, 어떻게 관리를 해줘야 할지 고민을 많이 했다. 지금 그런데 좌표의 제한이 50이고 오락실 번호도 그리고 방문 가능한 횟수의 제한도 50이기 때문에 이 모든 정보(y, x, 방문 횟수, 이전에 방문한 오락실 번호)를 다 넣어서 4차원 배열을 사용해 보기로 했다. 어차피 뭐 다 해봤자 50^4=6250000 이니까... int dp[54][54][54][54]; // y,x,최근에 방문한 오락실 번호,지난 오락실 수 일단 초기에 값을 받으며 dp 테이블을 세팅해 주는 작업을 진행하였다. void init() { cin >> n >> m ..
2025.03.01