[TIL] 31일차 _ 일정관리 앱 Dev #6

Seoyeon Lee·2025년 11월 17일

Today I Learned ...

오늘은 코드카타 SQL 45번 문제와 알고리즘 44-45번 문제를 풀고, 일정관리 앱 Dev 과제의 Lv. 6, 7을 진행했다!


🗒️ 코드카타 #24

오늘 진행한 SQL 문제는 특정 조건을 가진 데이터를 출력하는 것이다.
사실 사전캠프 때 시간이 남아 이 문제를 풀어봤었기 때문에,, 별다른 어려움 없이 해결할 수 있었다.

오늘은 총 2개의 알고리즘 문제를 풀었다.
첫 번째 문제는 지난번에 풀다 끝내 해결하지 못한 문제인데...
다양한 명함의 크기를 입력받으면, 모든 명함을 수용할 수 있는 최소 크기의 지갑, 직사각형의 크기를 구하는 것이었다.
처음에는 입력받은 직사각형을 가로 길이들과 세로 길이들로 분리해서 가로의 최댓값과 세로의 최댓값을 곱해서 계산했는데...
명함을 90도 돌려서 지갑에 넣을 수 있다는 조건이 있었다...
가로와 세로로만 나누면 이런 모든 경우의 수를 계산할 수 없게 된다...
지난 주에 문제를 풀 때는 여기에서 막혀서 문제를 더 풀 수 없었다.
그런데 오늘 생각해보니 가로와 세로가 아니라, 가로와 세로 중 작은 값과 큰 값으로 나누면 된다는 사실을 깨달았고!!
결국 작은 값 중 최댓값과 큰 값 중 최댓값을 곱하며 최소 직사각형의 크기를 구할 수 있었다.

그리고 오늘 푼 두 번째 문제는 알파벳과 공백으로 이루어진 문자열과 정수를 입력받으면, 문자열을 정수만큼 미뤄서 반환하는 것이었다.
문제에 접근 자체는 어렵지 않게 할 수 있었다.
문자를 아스키코드로 바꿔서 숫자를 더한 뒤에 다시 문자로 바꾸면 되는 것이었다.
그런데, 아스키코드는 순환하는 숫자가 아니라 소문자 z로 끝나면 특수문자가 이어지고, 또 다시 대문자 A부터 시작했다가 Z로 끝나면 또 다른 특수문자로 이어진다..
그러니 더할 때 z를 넘어가지 않고 다시 a로 돌아가서 더해주어야 하는데... 여기서부터 어떻게 해야할지 감이 안 잡혔다.
결국은 if문 안에 if문 안에 if문을 더하며 어찌저찌 해결은 했지만, 매우 마음에 들지 않았다...
다른 사람들의 풀이를 보니, 처음부터 알파벳의 아스키코드에서 a의 아스키코드를 빼면 알파벳 순서만 남게 되고, 여기에 입력받은 정수를 더하고, 26으로 나눈 나머지를 구하면 계산된 알파벳 순서만 남게 된다.
여기에 다시 a의 아스키코드를 더하면 최종적인 알파벳의 아스키코드를 구할 수 있게 된다.

이제 그래도 문제는 풀 수 있는 수준까진 되었지만,,
제발 조금만 더 똑똑해지자,,

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


🖥️ 일정관리 앱 Dev 프로젝트 #6

오늘은 일정관리 앱 Dev 프로젝트의 Lv. 6과 7을 진행했다!

Lv. 6에서 요구하는 내용은 비밀번호를 암호화하는 것이다.
드디어 암호화!! 재미있는게 시작되었다.

과제 자료에서 BCryptPasswordEncoder를 사용하는 방법을 간단히 알려주고 있는데,
BCryptPasswordEncoder는 스프링 시큐리티 프레임워크에서 제공하는 클래스 중 하다이다.
BCrypt라는 해싱 함수를 사용하는데, BCrypt의 가장 큰 특징은 매번 새로운 솔트값을 생성하여 암호화한다는 것이다.
여기에서 솔트란 비밀번호를 암호화할 때 추가하는 랜덤 데이터인데, 매번 새로운 솔트값을 생성하기 때문에, 같은 비밀번호를 여러번 암호화하면 매번 다른 결과가 나오게 된다.

BCrypt는 단방향 암호화, 즉 복호화가 불가능한 암호화 방식을 사용하기 때문에
BCryptPasswordEncoder 클래스에서는 암호화하는 encode() 메서드 뿐만 아니라, 입력된 비밀번호가 암호화된 비밀번호와 일치하는지 확인하는 marches() 메서드도 함께 제공하고 있다.

BCryptPasswordEncoder를 사용하기 위해서는 해당 의존성을 추가하고, 클래스를 만들어서 사용하면 되는데..!
사실 과제 자료에서 다 알려줘서 그대로 복사, 붙여넣기 해서 사용하기만 하면 됐다ㅎㅎㅎ

실제로 구현하는 것보다는 새로운 개념을 정리하는 데에 더 많은 시간을 쓰게 되었다.
여러가지의 암호화 방법이 있다고 했는데, 이런 저런 방법들을 사용해보고 싶다.

그리고, Lv.7에서 요구하는 내용은 댓글 CRUD를 구현하는 것이다.
사실 댓글 CRUD는 이전 과제에서도 진행했었기 때문에 큰 어려움 없이 해결할 수 있었다.

다만, 댓글이 생김으로써 일정 관리 API와 유저 관리 API에 업그레이드 하고 싶어진 부분들이 있었는데,
단건 일정 조회 시에 해당 일정의 댓글을 함께 반환하고, 일정 삭제 시 해당 일정의 댓글을 함께 삭제하는 부분까지는 구현을 완료했다.

일정 삭제 시 댓글도 함께 삭제하는 부분은 지난 과제에서도 진행했었는데, 나는 아무 생각없이 일정을 삭제한 후에 댓글을 삭제했었다.
그런데, 사실 일정과 댓글은 부모-자식 관계이고, 부모가 자식보다 먼저 삭제될 수는 없었다.
스프링이 이정도는 알아서 처리해주지만, 나중에 문제가 생길 수도 있기 때문에
이번에는 두 데이터 사이의 관계를 인식하고, 댓글을 먼저 삭제하고, 일정을 삭제하는 순서로 로직을 구현했다.

이제 단건 유저 조회 시에 해당 유저가 작성한 일정과 댓글을 함께 반환하고,
유저 삭제 시에 해당 유저가 작성한 일정과 댓글을 모두 삭제하는 로직을 구현할 예정이다.

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


🙃 오늘의 느낀점

오늘은 오랜만에 집중해서 과제를 많이 해결했다.
특히 오늘 암호화에 대해 찾아보는게 너무 재미있었다.
아직은 제공해주신 자료를 그대로 복붙하는 수준으로밖에 구현하지 못하지만,, 언젠간 이 원리를 알고 스스로 사용해보고 싶다.

내일 진행하게 될 Lv.8에서는 페이징이라는 또 새로운 것을 시도해보게 된다.
페이징이 무엇이고, 어떻게 작동되는 것인지는 너무 잘 알지만, 이걸 내가 구현해보게 될 줄은 상상도 못했는데,,,
내일.. 열심히 찾아보야겠다.

profile
백엔드 개발자 지망생

0개의 댓글