2025/03 18

WebMvcTest + Spring REST doc + Swagger 적용 ( 2 / 2 - Spring REST doc + Swagger )

plugins { id 'java' id 'org.springframework.boot' version '3.4.3' id 'io.spring.dependency-management' version '1.1.7' id 'com.epages.restdocs-api-spec' version '0.19.4' // ✅ OpenAPI spec 생성용}dependencies { // ✅ REST Docs testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' // ✅ OpenAPI 3 스펙 변환 라이브러리 testImplementation 'com.epages:restdocs-api-spec-mo..

Project/Boilerplate 2025.03.29

WebMvcTest + Spring REST doc 적용 ( 1 / 2 - MockMvc )

WebMvcTest + Spring REST doc 을 적용 적용 이유: 테스트와 동시에 문서화를 자동화 할 수 있기에 문서 작성의 편리함 Spring REST doc을 선택한 이유: Swagger와 달리, 프로덕트 코드에 테스트 관련 코드가 포함되지 않음. 이후 Swagger UI만 가져와서, Spring REST doc과 Swagger의 장점을 합칠 예정 RestAssured가 아니라 MockMvc를 선택한 이유:RestAssured는 @SpringBootTest를 실행해야 하기 때문에 속도가 느림.  @WebMvcTest(GreetingController.class)는Spring에서 웹 계층(Controller) 만 테스트하기 위한 전용 어노테이션입니다.속도는 빠르면서도 HTTP 요청/응답 흐름을 ..

Project/Boilerplate 2025.03.28

LLM 학습 시 내부 학습 원리

LLM 학습의 본질: 확률 분포 예측주어진 입력(문맥)에서 다음 단어(토큰)가 나올 확률 분포를 예측하는 모델ex)Input: ENFP 스타일로 바꿔줘: 나도 좋아해.Output: 헐~ 나도 진짜 좋아해~!모델은 이 Input 다음에 등장할 문장으로 "헐~"이 등장할 확률이 가장 높아지도록 조정함.  학습 과정 요약Step 1. 학습 데이터 준비 "ISTP 스타일로 바꿔줘: 나도 그거 진짜 좋아하는데! "-> "나도 좋아해" Step 2. 모델 입력 형태로 인코딩 (tokenization) 텍스트는 모두 숫자 토큰으로 바뀌고, 각 토큰마다 다음 토큰의 확률을 예측하도록 함.ex) ISTP -> 1234, 스타일 ->  0812, ... input 처리: "ISTP 스타일로 변경: 나도 그거 진짜 좋아하는..

Computer Science/AI 2025.03.28

PERT와 LoRA란 무엇인가

파인튜닝의 새로운 대세: PEFT와 LoRA란?요즘 AI 모델 파인튜닝을 이야기할 때 빠지지 않는 키워드가 있습니다.바로 PEFT와 LoRA입니다.💡 "기존 대형 모델을 빠르고 가볍게, 그리고 효율적으로 파인튜닝할 수 없을까?"이 질문에 대한 해답이 바로 PEFT (Parameter-Efficient Fine-Tuning), 그리고 그 중 하나인 **LoRA (Low-Rank Adaptation)**입니다.1. PEFT란 무엇인가요?PEFT = Parameter-Efficient Fine-Tuning(파라미터 효율적 파인튜닝) PEFT는 대형 언어 모델(LLM)의 전체 파라미터를 학습하지 않고,일부 파라미터 또는 추가 모듈만 학습함으로써 훨씬 효율적으로 파인튜닝하는 기법입니다.💡 왜 PEFT가 필요한..

Computer Science/AI 2025.03.24

Spring @ModelAttribute 매핑 오류 해결 방법 (Setter, Enum 변환)

Spring Boot에서 @ModelAttribute를 사용하여 Query String을 DTO(PostSearchOptions)에 바인딩할 때, 값이 매핑되지 않는 문제가 발생했습니다.문제 상황: Query String이 PostSearchOptions에 매핑되지 않음예를 들어, 다음과 같은 컨트롤러가 있다고 가정해봅시다.@GetMapping("/list")public ResponseEntity> getAllPostsWithSearchOptionsByPage( Pageable pageable, @ModelAttribute PostSearchOptions postSearchOptions // 🔥 Query String → 객체 매핑) { return ResponseEntity.ok( ..

Spring Data JPA에서 커스텀 Repository 구현체 인식 및 작동 방식

Spring Data JPA의 Repository 시스템 이해하기Spring Data JPA를 사용하면 기본적인 CRUD 기능을 손쉽게 제공받을 수 있습니다.예를 들어, JpaRepository를 상속받으면 findById(), save(), delete() 등의 메서드를 자동으로 사용할 수 있죠.public interface PostRepository extends JpaRepository {}위 코드만으로도 Post 엔티티에 대한 기본적인 데이터 접근 기능을 사용할 수 있습니다.하지만, 복잡한 쿼리나 커스텀 로직이 필요할 때는 어떻게 해야 할까요? 이럴 때 필요한 것이 바로 커스텀 Repository 구현체입니다.Spring Data JPA의 커스텀 Repository 적용 방법Spring Data ..

필터 예외 처리

문제:OAuth2 인증 인가 도입 후, 필터측에서 잡는 에러에 대해서 200Ok, OAuth2 기본 로그인 html이 response로 응답됨. 원인:Spring Security는 Spring Context 바깥 쪽의 Filter에서 처리되기 때문에 Spring Context 내에서 예외 처리하는 @RestControllerAdivce로 예외 처리할 수 없음. 가장 마지막 필터인 AuthorizationFilter에서 인증이나 인가 예외가 터지면 이전 필터인 ExceptionTranslationFilter로 해당 예외들이 넘어가고, 이 필터에서 인증과 인가 오류에 대해 로그인 페이지 리디렉션을 보내기 때문에.  해결:authenticationEntryPoint와 accessDeniedHandler를 커스..

Project/Boilerplate 2025.03.17

API 예외 처리

기존 예외 처리 문제점IllegalArugmentException, IllegalStateException 등 혼용해서 쓰다 보니 헷갈림.IllegalArgumentException(UserError.USER_NOT_FOUND.getMessage()) 와 같은 방식으로 메세지를 전달하기 때문에 코드 중복이 많아짐.RestControllerAdvice에서 전역적으로 관리할 때, 새로운 클래스의 에러가 추가될 때 마다 계속해서 추가해주어야 함. 해결:에러 코드와 메세지를 관리할 ErrorCode 인터페이스public interface ErrorCode { String name(); HttpStatus getStatus(); String getMessage();} 도메인 별 에러코드@Gette..

Project/Boilerplate 2025.03.17

@PreAuthorize를 활용한 댓글 수정/삭제 권한 관리 및 코드 개선

기존 문제점: 관리자(Admin) 권한이 있어도 댓글 수정/삭제 불가기존 코드 분석현재 @AuthenticationPrincipal을 이용하여 컨트롤러에서 userId를 추출하고, 이를 서비스 계층에서 권한 검증하고 있다.@PutMapping("/{commentId}")public ResponseEntity updateComment( @AuthenticationPrincipal JwtUserDetails userPrincipal, @PathVariable Long commentId, @Valid @RequestBody CommentRequest request) { return ResponseEntity.ok( commentService.update( ..

Project/Boilerplate 2025.03.10