본문 바로가기

분류 전체보기

(18)
Kotlin의 @ModelAttribute와 Custom Validation 어노테이션 적용 문제 해결 사례 Spring Boot 프로젝트에서 @ModelAttribute를 통해 요청 데이터를 받으면서, Kotlin의 데이터 클래스를 활용해 커스텀 유효성 검사 어노테이션을 적용할 때 발생했던 문제와 이를 해결한 과정을 정리한다.문제 상황 다음과 같이 @ModelAttribute로 선언한 데이터 클래스 PayRequest가 있다. userId 필드에는 커스텀 유효성 검사 어노테이션이 적용되어 있다. PayRequest 클래스data class PayRequest( val amount: Double, // 결제 금액 @CheckUserId val userId: Long, // 사용자 ID) { init { require(amount > 0) { "금액이 유효하지 않습니다." } ..
유효성 검사 리팩토링 : Kotlin when 구문으로 중복 줄이기 문제 상황유효성 검사 리팩토링 예시를 위해 사용자가 이메일을 수정할 때, 여러 가지 조건을 체크해야 하는 상황을 가정하였다. 조건은 다음과 같다. 이메일이 기존 이메일과 같으면 안 되고, 공백으로 제출되면 안 되며, 이메일 형식이 잘못되었거나 이미 다른 사용자에 의해 사용 중일 경우에는 예외가 발생해야 한다. 기존 코드에서는 각 조건마다 BusinessException을 중복해서 던지고 있다. 각 조건마다 동일한 예외 처리 구문이 반복되는데, 이를 when 구문으로 개선할 수 있다. 이로 인해 코드의 중복을 줄이고, 유지보수성을 높일 수 있다. 리팩토링 전 코드private fun validateUpdateEmail(req: EmailUpdateDto) { val userDto = userDomai..
방송통신대학교 컴퓨터과학과 3학년 2학기 수강 과목 후기 수강신청2학기에 수강한 과목선형대수 - 2학년 과목자료구조 - 2학년 과목프로그래밍언어론 - 2학년 과목컴퓨터과학개론 - 1학년 과목멀티미디어시스템 - 1학년 과목대학영어(교양) - 1학년 과목모두 3학점씩 총 18학점3학년 1학기로 편입한 방송통신대학교 컴퓨터과학과의 두 번째 학기도 무사히 끝났다!2학기 수강신청 과목을 선택할 때도, 1학기와 마찬가지로 1) 1,2학년 과목 위주로, 2) 추후 듣고 싶은 과목의 선행 여부 , 3) (검색을 통한)수강 후기 등을 고려하였다.    과목별 후기1. 선형대수개요선형대수는 수강 신청할 때 들을지 말지 고민을 많이 하면서 마음을 몇 번 바꿨었다. 인공지능, 컴퓨터그래픽스의 선행과목인데 두 과목에 대한 수강 의지가 그렇게 확고하지 않았다. 주변으로부터는 '어려우니..
클린 스프링: 스프링 개발자를 위한 클린 코드 전략 - 이일민(토비) 2024 인프콘 다시보기 - 클린 코드에 대한 이일민(토비)님의 강의를 들으며 내용을 정리해 보았습니다. [참고]영상은 아래 링크에서 보실 수 있습니다.https://youtu.be/d3krJ4el8Hg?si=4gK7MB1HM5Kt5uob   개발자에게 기술 성장과 관련된 책을 추천하면?첫 번째 - 클린 코드향로님의 클린 코드에 대한 말클린코드를 지향할수록 점점 구현 능력이 떨어진다 이런 생각 해보신 적 없으세요?클린 코드에 집중할수록 좋은 코드, 구조, 설계에 대해 집착하게 되어 구현 속도가 느려지고 구현 능력이 떨어진다.클린 코드라는 말이 처음 쓰인 곳 : 켄트 벡의 테스트 주도 개발Clean Code That Works (작동하는 클린 코드)그러나 클린 코드에 대한 다음과 같은 오해가 존재한다.클린..
[오류 해결] 스프링 시큐리티 로그인 실패 시 무한 재로그인 문제 해결 스프링 시큐리티 프레임워크를 사용하는 방법은 프로젝트마다 천차만별일 것이라고 생각이 된다. 그래서 개인적으로 스프링 시큐리티에서 문제가 발생했을 때, 디버깅하는 것이 어렵다. 구글링을 했을 때 어떤 문제 상황이 일치하면서 시큐리티 설정 세팅도 유사한 사례를 찾기가 어렵기 때문이다. 이번에 스프링 시큐리티를 사용하는 인증용 모듈을 리팩토링했는데, 리팩토링 후 로그인 실패 로직에서 문제가 생겼다.원래 로그인 실패 시 로그인 실패 사유를 응답하는 방식으로 작동했던 코드가, 로그인 실패 시 계속 로그인을 시도하며 무한 반복하여 결국 timeout이 되는 상황이 발생하였다. 디버그 모드를 통해 디버깅을 했고, 밝혀낸 원인은 ProviderManager에서 찾을 수 있었다.public class ProviderMa..
코틀린의 스코프 함수(scope functions) 코틀린 기초 문법을 공부할 때, 스코프 함수라는 것을 접하고 처음에는 잘 이해가 가지 않았다.이걸 어느 상황에서 써야 하는지, 왜 써야 하는지 잘 와닿지 않았기 때문이다.점점 코틀린으로 코딩을 하면서 스코프 함수를 사용해야 하는 상황이 어떤 것인지 알게 되었고, 이제는 꽤 자주 사용하게 되었다. 적절하게 사용하면 편리한 스코프 함수에 대해 정리해 보려고 한다. 스코프 함수 이름에서 보듯이, 스코프 함수는 코틀린에서 특정 객체의 스코프(범위) 내에서 작업을 수행하도록 도와주는 함수이다.이 함수들은 블록 내에서 객체에 대한 일련의 작업을 실행하게 한다. 또한 스코프 함수를 사용하면 코드를 훨씬 간결하고 가독성 있게 작성할 수 있다.대표적인 스코프 함수는 let, apply, also, run, with가 있..
JIRA에 이슈 한번에 대량 등록하기 이번 프로젝트를 진행하며 JIRA에 이슈를 대량으로 한번에 등록해야 하는 일이 생겼다.하나의 api 작업에 대해서 서비스단 / 컨트롤러단 / 리포지토리단 3번에 나눠서 반복해서 이슈를 등록해야 하는 상황이다.일일이 등록하기에는 많은 양이어서 일괄로 등록하는 방법을 활용하였다. 등록하는 과정 자체는 어렵지 않은데, 다음에 또 사용할 일이 있을 것 같아 기록을 위해 정리하였다.  먼저, 이슈 일괄 등록을 할 때 기존에 프로젝트에 등록된 이슈들을 이용할 것이 때문에 이슈 탭에서 내보내기를 눌러 csv 파일을 내려받는다.위의 'csv 내보내기 (내 기본값)'을 선택하여 내려받았다.  그리고 내려받은 csv 파일을 구글 스프레드 시트를 통해서 필요한 부분을 수정하였다.위의 내보내기를 하면 모든 이슈가 다 저장되는..
Java에서 데이터 중심 프로그래밍을 지원하는 기능들 Java에서는 최근에 데이터 중심 프로그래밍(Data-Oriented Programming, DOP)을 지원하는 기능들이 도입됐다. 특히 Java 17 이후 이러한 기능들이 더욱 강화되면서 데이터를 보다 직관적이고 효율적으로 다룰 수 있게 되었다. Java에서 지원하는 4가지 주요 DOP 기능(Sealed Types, Records, Pattern Matching, Smart Switch Expressions)을 소개하고, 각각의 기능이 어떻게 활용될 수 있는지 예시와 함께 알아보려고 한다.1. Sealed Types (봉인된 타입)Sealed Types는 클래스 계층 구조를 제어할 수 있게 해주는 기능이다. 어떤 클래스가 특정 클래스나 인터페이스를 확장할 수 있는지를 명시적으로 제한한다. 이를 통해 상..