본문 바로가기

분류 전체보기34

프로그래머스 - 추억 점수 코딩테스트 연습 - 추억 점수 | 프로그래머스 스쿨 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr import java.util.*;class Solution { public int[] solution(String[] name, int[] yearning, String[][] photo) { Map score = new HashMap(); for(int i = 0; i 2025. 4. 11.
프로그래머스 - 교점에 별 만들기 코딩테스트 연습 - 교점에 별 만들기 | 프로그래머스 스쿨 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 두 직선의 교점 구하기 1번 직선 : A₁x + B₁y + C₁ = 0   2번 직선 : A₂x + B₂y + C₂ = 0   x = (B₁ * C₂ - B₂ * C₁) / (A₁ * B₂ - A₂ * B₁)y = (C₁ * A₂ - C₂ * A₁) / (A₁ * B₂ - A₂ * B₁)  문제 파악교점 구하기(정수인지 판별)가장 작은 x, y 가장 큰 x, y 구하기위에 구했던 값들로 2차원 배열의 크기 정하기(y, x 순서)2차원 배열에 . 채우고 교점은 * 로 채우기  import java.u.. 2025. 4. 10.
AWS 프리티어 EC2 빌드 실패, 메모리 부족, 스왑메모리 설정 ubuntu 22.04 기준 명령어 sudo fallocate -l 4G /swapfilesudo chmod 600 /swapfilesudo mkswap /swapfilesudo swapon /swapfilesudo echo '/swapfile none swap sw 0 0' | sudo tee tc/fstabswapon -s // 스왑메모리 설정된 것 확인 2025. 3. 27.
RequestDto에서 @NotBlank시 Error 발생 MemberCreateRequestDto에서 검증을 위해 @NotBlank 어노테이션 사용 @NotBlank(message = ValidationErrorMessage.MEMBER_ROLE_IS_NOT_NULL) MemberRole memberRole; 아래와 같이 Error 발생  이유@NotBlank 어노테이션은 ‘CharSequence’ 인터페이스를 구현한 String, StringBuilder 등에만 적용 되며 아래와 같은 오류가 발생한다.javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.NotBlank' valid.. 2025. 3. 27.
티켓 발급 서비스에서 JPA 낙관적 락 구현 1. Entity에 @Version 필드 추가2. 트랜잭션 설정3. @Retry 어노테이션을 사용한 자동 재시도 구현 aop와 retry 의존성 추가 // Retry implementation "org.springframework.retry:spring-retry" // AOP runtimeOnly 'org.springframework.boot:spring-boot-starter-aop'  concert.findbyId > 현재 version값을 1차캐시에 저장     트랜잭션 종료, 커밋 시점에 DB의 version값과 1차 캐시에 저장된 값을 비교함     버전 일치 > 버전 값 증가 / 버전 불일치 -> OptimisticLockException 발생 -> Retry     E.. 2025. 3. 27.
Lock Lock 1. 낙관적 락 (Optimistic Lock)특징- 애플리케이션 레벨에서 관리됨- 별도의 락을 걸지 않고 트랜잭션 종료 시점에서 데이터 변경 여부를 확인하여 충돌을 감지- 일반적으로 버전(version) 필드를 사용하여 변경을 감지- JPA 사용 시 @Version 어노테이션 활용2. 비관적 락 (Pessimistic Lock)특징- 데이터에 접근할 때 즉시 락을 걸어 충돌을 방지- 락을 거는 방식에 따라 공유 락(S-lock) 과 베타 락(X-lock) 으로 나뉨 공유 락 (Shared Lock, S-Lock)- 여러 트랜잭션이 동시에 읽기(Read) 가능- 하지만 쓰기(Write)는 불가능 베타 락 (Exclusive Lock, X-Lock)- 하나의 트랜잭션만 데이터를 읽고 수정할 수 있.. 2025. 3. 27.
Spring Event - 최종 프로젝트 관련 내용 포함 Spring Event는 애플리케이션 내에 발생하는 이벤트를 기반으로 Component들을 서로 독립적으로 동작할 수 있게 해주는 이벤트 기반 처리 매커니즘 언제 사용?컴포넌트 간 느슨한 결합이 필요할 때ex) 회원가입 이메일/문자 발송 비동기작업 처리ex) 재고 업데이트, 대용량 데이터 처리와 같은 작업*카프카나 이런거에 도입을 한다하면 퍼블리셔랑 리스너만 카프카에 맞게 바꿔주면 됨 ApplicationEvent : 이벤트 객체public record UserSaveEvent(Long id, String userName) {} ApplicationEventPublisher : 이벤트를 발행하기 위해 사용하는 인터페이스 publishEvent() 메소드를 호출하여 ApplicationContext에 이벤.. 2025. 3. 27.
Redis 기본 개념, 간단한 사용 방식 정리 Redis(Remote Dictionary Server)NoSQL 방식으로 동작메모리에 저장되어 응답속도가 빠름휘발성. 메모리에 저장되는 데이터는 보존 X, 다만 RDB 스냅샷, AOF 로그의 방법이 있고 보통 혼용해서 사용함. AOF 로그란 모든 변경사항을 로그에 기록하고 서버 재시작 시 그 변경사항들을 순차적으로 재실행함 Redis 데이터 타입String, Bitmaps, Lists, Hashes, Sets, Sorted Sets, HyperLogLogs, StreamsRedis는 어디에 사용해야하는걸까?캐싱(Caching) : 자주 조회되는 데이터를 미리 저장해두고 빠르게 제공하기 위해 사용 ex) 인기 상품 목록을 Redis에 저장하여 DB 부하 감소세션 관리(Session Management) .. 2025. 3. 27.
자바 시간 라이브러리 출처 : Overview (The Java™ Tutorials > Date Time > Standard Calendar)클래스출력Instant2013-08-20T15:16:26.355ZLocalDate2013-08-20LocalDateTime2013-08-20T08:16:26.937ZonedDateTime2013-08-21T00:16:26.941+09:00[Asia/Tokyo]LocalTime08:16:26.943MonthDay--08-20Year2013YearMonth2013-08MonthAUGUSTOffsetDateTime2013-08-20T08:16:26.954-07:00OffsetTime08:16:26.957-07:00DurationPT20H (20 hours) Period P10D  (10 d.. 2025. 3. 27.
프로그래머스 문제 동영상 재생기 코딩테스트 연습 - [PCCP 기출문제] 1번 / 동영상 재생기 | 프로그래머스 스쿨  정답import java.util.*;class Solution { public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) { //video_len 비디오 길이, pos 현재위치 String[] posStr = pos.split(":"); String[] videoStr = video_len.split(":"); String[] op_startStr = op_start.split(":"); String[] op_endStr.. 2025. 3. 26.
x 사이의 개수 개선하기 코딩테스트 연습 - x 사이의 개수 | 프로그래머스 스쿨 처음 만든 코드class Solution { public int[] solution(String myString) { List answer = new ArrayList(); String[] mString = myString.split(""); int cnt = 0; for(String s : mString) { if(s.equals("x")) { answer.add(cnt); cnt = 0; continue; } cnt++; } a.. 2025. 3. 25.
TIL 동시성비교 Trouble Shooting 프로젝트에서 발생한 문제저희 프로젝트에서 경험한 문제는 다음과 같습니다:가용 티켓: 3장동시 접근 사용자: 10명예상 결과: 3개의 티켓 발급실제 결과: 9개의 티켓 발급 (오류)해당 시나리오에서 티켓 발급 시, 위에서 설명한 상황이 발생하였습니다.Transaction이 완료되기 전에 Lock 이 해제되어, 다른 Thread 들이 아직 커밋되지 않은 데이터를 기반으로 티켓을 발급하여 Dirty Read 가 발생하였습니다.@Transactional 완료 이전 Lock 해제 시 발생하는 문제Transaction 완료 이전 Lock 해제 시, Dirty Read 문제가 발생할 수 있습니다.이는 다음과 같은 상황에서 일어납니다:Transaction 이 시작되고 Lock 을 획득합니다.데이터를 수정하지만 아직 커.. 2025. 2. 7.
[Spring] 대용량 테스트(offset, index 적용) jpa 방식으로 saveAll 했다가 강제종료했다.알고 보니 bulk insert로 더 괜찮게 할 수 있다는 것을 발견했다. 처음에는 과제의 의미를 제대로 이해하지 못해 이것저것 시도해보다가init()으로 초기 데이터를 셋팅해주었다. 셋팅 이후에는 주석처리 해놓았다.데이터 셋팅@Component@RequiredArgsConstructorpublic class InitData { JdbcTemplate jdbcTemplate; @PostConstruct @Transactional public void init() { final int BATCH_SIZE = 10_000; List userList = new ArrayList(); String sql = "INSERT INTO user.. 2025. 1. 23.
[AWS] S3 기능으로 유저 이미지 저장 기능 구현하기 해당 글은 AWS 에 github actions로 빌드하는 과정이 다른 글에 포함 되어있습니다.[AWS] aws에 배포하기 [AWS] aws에 배포하기AWS에서 ec2 생성 ec2에 docker, docker compose github secretkey 기능을 활용하여 action secret key에 AWS pair key 설정(SSH_KEY, SSH_HOST)github workflow 설정(main으로 merge 시 배포하도록 설정)아래 코드는 amazon-linux 기heehyun0221.tistory.com  1. build.gradle에 의존성 추가implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'i.. 2025. 1. 22.
[AWS] S3의 Presigned URL 이란? 백엔드 서버에서 presigned url 반환하기 AWS S3의 Presigned URL이란? 업로드에 대한 의미도 있지만진행하고 있는 백엔드 부분(이미지 요청시 Presigned URL 반환)만 구현하기에다운로드에 대한 의미만 전합니다. 서버는 S3에 대한 권한을 가지고 있지만 클라이언트는 S3에 대한 권한이 없기에 이미지에 대한 접근 권한이 없습니다.그렇기에 이 '유효기간'을 가진 URL을 알고 있으면 누구나 접근할 수 있는 경로를 서버가 클라이언트에게 반환해주어 이미지에 접근할 수 있도록 하는 기술입니다. AWS S3 웹 콘솔 상의 다음 메뉴(미리 서명된 URL과 공유)를 누르면 공유 시간을 정할 수 있습니다.  목표는 배포된 서버의 이미지 조회 API에 GET 요청을 보낼 때 presigned url을 반환 해주는 것입니다.aws-java-sdk.. 2025. 1. 21.
[AWS] aws에 배포하기 AWS에서 ec2 생성 ec2에 docker, docker compose github secretkey 기능을 활용하여 action secret key에 AWS pair key 설정(SSH_KEY, SSH_HOST)github workflow 설정(main으로 merge 시 배포하도록 설정)아래 코드는 amazon-linux 기준으로 작성된 .github/workflows/deploy.yml 파일이며, 이외 리눅스를 사용할 시 리눅스 명령어에 맞게 수정이 필요하다. 1. EC2 생성( Ubuntu Server 22.04 LTS (HVM) ) 2. 키페어를 받아주고putty 설치Category-> Connection -> SSH -> Auth -> Credentials에 ppk를 올려서 접속해준다.logi.. 2025. 1. 20.
[Spring] ArgumentResolver란? + 유저 정보 넘겨주기 ArgumentResolver란?컨트롤러로 들어온 파라미터를 가공, 수정하기 위한 것이다.HandlerMethodArgumentResolver를 구현한다. 보통 여태까지의 코드들은 컨트롤러에서 유저아이디를 꺼내왔었지만 ArgumentResolver를 사용함으로써 이 코드들이 중복되는 것을 방지한다.(물론 @RequestAttribute Long userId를 파라미터로 해서 가져오는 방법도 존재한다, JwtFilter에서 setAttribute로 해주었기 때문.)  코드의 목적 : 컨트롤러에 AuthUser라는 내가 만든 객체, 내가 설정한 정보들을 Controller에 넘기고 싶다.AuthUserArgumentResolver에선AuthUser의 어노테이션이 제대로 사용되어 있는지 유효성을 검사하는 메소.. 2025. 1. 17.
[Spring] Spring Security - 필터를 Spring Security Filter로 갈아끼워보자! 1. SecurityConfig를 작성해준다.addFilterBefore 구문으로 jwtFilter가 SecurityContextHolderAwareRequestFilter보다 먼저 실행된다.jwtFilter에 /auth 로 시작하면 다음 필터로 이동하는데 이 설정대로 확인을 하게 된다.기존에 jwtFilter가 jwt토큰에서 역할을 뽑아 확인하던 내용들은 제거하고 SecurityContextHolderAwareRequestFilter에서 처리하도록 설정했다.@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { return http .csrf(AbstractHttpConfigu.. 2025. 1. 16.
[JPA] Entity의 키 생성 전략 JPA에서 Entity의 키 생성 전략이란, 데이터베이스의 기본 키를 어떻게 설정할 지 정의하는 방식이다.키 생성 전략은 @Id와 @GeneratedValue 어노테이션으로 설정한다.이 글에서 알아볼 건 @GeneratedValue에 strategy 옵션이다. 1. IDENTITY  - 데이터베이스가 기본 키를 자동으로 생성한다.  - 주로 AUTO_INCREMENT 컬럼이 있는 데이터베이스에서 사용된다.  - 장점 : 간단하게 설정할 수 있고, 데이터베이스가 키를 관리한다.  - 단점 : 배치 처리에 비효율적일 수 있다.@Entitypublic class MyEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private.. 2025. 1. 14.
[404 NOT DELIVERY] Review 가게별 조회 기능 개선하기 프로젝트에서 리뷰와 코멘트를 담당으로 진행하였으며 ERD는 아래와 같이 설계를 진행했다.  리뷰와 코멘트는 1대1관계이고 Comment가 review_id를 갖는 관계이다.여기서 가게기준으로 리뷰와 코멘트를 한번에 출력될 수 있도록 조회 기능을 만드는 것이 문제였는데,처음 구현했던 코드의 문제점이 보여 리팩토링을 진행했다. 기존 코드의 문제점1. N+1 문제 : reviewRepository를 통해 리뷰 리스트를 가져온 후, 각 리뷰에 대해 commentRepository를 사용해 코멘트를 개별적으로 조회, 리뷰 13건과 코멘트 13건 기준으로 총 27개의 쿼리(1개는 가게 확인 쿼리)가 실행되어 데이터베이스의 부하를 증가시키고 성능을 저하시킴2. 각 리뷰마다 별도의 쿼리가 실행되면서 네트워크 I/O가 .. 2025. 1. 13.
[JPA] Fetch Join과 Paging 동시 사용 충돌 페이징을 하기 위해선 전체 카운트가 있어야한다.그래야 아래 사진처럼 몇페이지까지 있는지 페이징 메타 데이터 제공이 가능하다. 여기서 왜 문제가 생기냐면보통 JPA는 무조건 countQuery를 하게 되는데 JPA가 이 FETCH JOIN이 담긴 쿼리를 기반으로 countQuery를 지멋대로 작성해버린다. 그렇기 때문에 아래 코드와 같이 countQuery를 명시적으로 작성해주게 되면 이 오류가 풀리게 된다.@Query(value = "SELECT t FROM Todo t JOIN FETCH t.user u ORDER BY t.modifiedAt DESC" ,countQuery = "SELECT COUNT(t) FROM Todo t") Page findAllByOrderByModifiedAtDe.. 2025. 1. 3.
[Spring-AOP]특정 api 로깅하기 - requestBody를 어떻게꺼내?? Admin 권한을 필요로 하는 API의 로그를 남기려고 한다.1. 요청 시각2. 요청 URL3. 요청 사용자 ID4. 요청 본문5. 응답 본문로그에 필요한 데이터는 이 5가지다. 다른 방법(Intercepter를 사용한다던가)이 있지만,메소드를 감싸는 형태로 실행되게끔 @Aspect어노테이션을 사용했다. (Aspect를 사용하는 Aspect-Oriented Programming은 다른 글에서 알아보도록 하자, 이곳에서는 메소드를 감싼다고 생각만 하면 충분히 로깅 기능을 구현할 수 있다.) 일단 첫번째로 어노테이션을 사용하려면 의존성을 추가해줘야된다.의존성을 추가해주고 intellij IDEA 기준으로 오른쪽 코끼리 모양의 새로고침을 해주면 의존성을 다시 빌드 해준다.implementation 'org.s.. 2025. 1. 3.
[JPA] 페이징의 n+1 문제 개선하기 기존에 Like 기능 개선하기에서 기본적인 n+1문제를 개선했는데,페이징 부분의 n+1문제 개선이 남았더랜다.Like 기능의 성능 개선하기 Like 기능의 성능 개선하기고민되는 코드는 CommentLike 부분으로여러 검증을 위해 Post와 Comment, User까지 조회를 하고 있다.아래는 내가 직접 작성한 코드인데 클라이언트로부터 PathVariable로 postId와 commentId를 받고 있다.userIdheehyun0221.tistory.com 전에 썼던 글에 Fetch Join에 대한 개념이 적혀있지 않아서 Fetch Join의 동작 방식에 대해 간단히 적어보려고 한다.Fetch Join은 연관된 엔티티나 컬렉션을 한 번의 쿼리로 가져오기 위해 사용되며 보통 N+1 문제를 해결하고 성능을 .. 2025. 1. 3.
[newsfeed] Like 기능의 성능 개선하기 고민되는 코드는 CommentLike 부분으로여러 검증을 위해 Post와 Comment, User까지 조회를 하고 있다.아래는 내가 직접 작성한 코드인데 클라이언트로부터 PathVariable로 postId와 commentId를 받고 있다.userId는 세션을 비교하고 있다.해당 기능의 흐름은이렇다. 1. 해당되는 게시글 찾기2. 해당되는 댓글 찾기3. 댓글을 단 유저와 현재 접속하고 있는 유저가 동일한지 확인(본인의 게시글에 좋아요를 누를 수 없음)4. 게시글을 작성한 유저와 친구인지 아닌지 확인(본인이면 넘어감)5. comment가 해당 post에 달린게 맞는지 확인6. 현재 유저가 이 코멘트에 좋아요를 누른 기록이 있는지 확인6-1. 있다면 해당 행 제거, 댓글 엔티티에 있는 좋아요 카운트 감소6-.. 2024. 12. 30.