[TIL] 60일차 _ Spring 플러스 프로젝트 #6

Seoyeon Lee·2025년 12월 29일

Today I Learned ...

오늘은 코드카타 SQL 76번 문제와 알고리즘 64번 문제를 풀고, Spring 플러스 프로젝트의 Lv.3-4를 진행했다.


🗒️ 코드카타 #48

오늘 푼 SQL 문제는 특정 조건의 count를 계산해서 비율을 구하는 문제였다.
특정 기간에 가입한 전체 유저 대비 물건을 구매한 유저의 비율을 구하는 것이었다.
여기에서 어떤 값을 서브쿼리로 만들어야 할까 고민했는데, 물건을 구매한 유저의 수는 컬럼으로도 추가해야했기 때문에, 전체 유저의 수를 서브쿼리로 계산하였다.
기준에 대해 약간 고민했지만, 문제 자체는 어렵지 않게 해결할 수 있었다.

오늘은 드디어 계속 헤매던 알고리즘 문제를 해결했다.
체육복을 잃어버린 학생이 있고, 이 학생은 앞뒤 번호의 학생에게만 체육복을 빌릴 수 있을 때, 여분의 체육복이 있는 학생에게 체육복을 빌릴 수 있는지를 확인하는 것이다.
사실 내가 해결한 것은 아니고.. 내가 푼 방식으로는 30개의 테스트 케이스 중 5번과 24번에서만 계속해서 실패했다.

그래서 다른 사람들의 풀이 방법을 참고했는데, 나와는 완전히 다른 방식으로 접근했더라.
나는 여분의 체육복이 있는 학생 배열을 기준으로 잃어버린 학생 배열과 비교했다.
그런데, 대부분의 다른 사람들은 전체 학생에 대해 학생들의 체육복 수의 배열을 만들고, 잃어버렸다면 0으로, 여분이 있다면 2로 체육복 수를 적용했다.
그리고 그 배열에 대해 0인 값을 기준으로 앞뒤를 살펴보고, 앞뒤 값 중 2인 값이 있다면 해당 값을 -1, 0이었던 값을 +1로 바꾸었다.
이렇게 해결하니 코드가 훨씬 더 간결해지고, 테스트도 별 문제 없이 잘 통과했다.

왜 내가 푼 방식은 5번과 24번에서만 계속 오류가 나는지 아직도 모르겠다...
5번과 24번 테스트에 대한 반례를 찾아보아야겠다.

이 문제는 프로그래머스의 Lv.3 문제였고, 내일부터는 Lv.4 문제를 풀기 시작하게 될 것이다..
Lv.3도 하루 안에 해결하지 못하고 있는데, Lv.4는 어떨지 걱정되지만.. 열심히 해봐야겠다.

오늘 푼 문제와 풀이는 깃허브를 통해 업로드해두었다.
GitHub 보러가기


🖥️ Spring 플러스 프로젝트 #6

오늘 드디어!! 500만 건의 유저 데이터 생성에 성공했다ㅎㅎ
사실 아직 JDBC에 대해 제대로 이해하지는 못했지만.. 인터넷 자료들을 열심히 뒤져보고 유저를 생성했다.

인터넷에 있는 대부분의 자료는 List를 파라미터로 받아서 리스트의 내용들을 쿼리문으로 바꾸고, insert를 진행하였다.
하지만, 나는 이 방법이 뭔가 이상하다고 느꼈는데, 500만 건의 데이터가 들어가는 리스트를 생성하는 것 자체가 서버에 부담이 될 것이라 생각했기 때문이다.

그래서 리스트를 생성하지 않고, 곧바로 쿼리문을 쌓아 저장할 수 있는 방법을 고민하고, 찾아봤다.
방법이 하나 있었는데,

String sql = "INSERT INTO users (email, password, user_role, nickname, created_at, modified_at) VALUES (?, ?, ?, ?, ?, ?)";

이렇게 value가 비어있는 쿼리문을 만들고, PreparedStatement의 setString을 사용해 제대로된 쿼리문을 만들었다.
그리고, addBatch를 통해 위 쿼리를 배치에 저장해두었다.
배치 사이즈는 10,000으로 설정해 5백만 건의 데이터를 1만 건씩 쪼개서 커밋하도록 설정하였다.

리스트를 생성하지 않고 쿼리문을 쌓는 방법을 찾는 데에 굉장히 시간이 오래 걸렸는데, 결국은 그냥 다른 사람들의 도움을 받는 것을 택했다...
JDBC에 대해서는 조금 더 찾아봐야겠다.

이제 드디어 데이터를 생성했으니 검색 성능이 어떻게 해야 좋아질 수 있을지 여러 방법을 다 시도해보았다.

나는 닉네임 일부가 일치하면 될 줄 알고 쿼리를 만들었는데, 알고보니 발제 문서에 닉네임이 정확히 일치해야 한다는 조건이 있더라.
뒤늦게 깨닫고 앞선 내용들을 모두 삭제하고.. 다시 처음부터 시작하였다.

그래도 이런 저런 방법들을 시도해보면서 유의미한 결과들을 알 수 있었다.
자세한 내용은 노션과 깃허브 리드미를 통해 작성해두었다.

이렇게 Lv.3까지의 내용들은 모두 마무리하였다.
코틀린도 도전해보고 싶은 마음이 있었지만, 시간이 이렇게나 빠듯할 줄은 몰랐다.
코틀린은 나중에 강의를 듣고 시도해봐야겠다.

내가 작성한 코드는 깃허브에 업로드해두었다.
GitHub 보러가기


🙃 오늘의 느낀점

정말 정말 해메다가 유저 데이터 생성에 성공했다.
그런데 기쁨과 동시에 문서 내용 똑바로 안 읽어서 뻘짓을 했다..
다음부터는 정말 천천히 잘 읽고 과제를 진행해야겠다..

이제 마지막 개인 프로젝트가 끝났고, 내일 해설 세션 이후에는 계속해서 팀 프로젝트가 진행된다.
팀 프로젝트 동안 배운 내용들을 열심히 적용해봐야겠다.

profile
백엔드 개발자 지망생

0개의 댓글