9/10
·
TIL
Today I LearnedSpring 플러스 주차 개인 과제조건 분기 방식으로 할 일 검색 기능 개선하기이번 과제에서는 할 일 목록을 조회할 때 다양한 조건을 적용할 수 있도록 코드를 개선하는 문제를 풀어보았다.먼저 `@RequestParam(required = false)`를 활용해 조건들을 필수값이 아니게 설정했다.컨트롤러는 아래와 같이 구성했다.@GetMapping("/todos")public ResponseEntity> getTodos( @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size, @RequestParam(required = false) Stri..
9/9
·
TIL
Today I LearnedQueryDSL#QueryDSL이란?QueryDSL은 자바 코드로 SQL처럼 쿼리를 작성할 수 있게 해주는 프레임워크다.JPA와 함께 사용하면 복잡한 조건 검색도 타입 안정성을 유지하며 구현할 수 있다.JPQL의 문자열 기반 쿼리보다 안전하고 IDE 자동완성도 지원된다.#QueryDSL의 사용 목적조건이 유동적인 검색 로직을 깔끔하게 처리할 수 있다.컴파일 시점에 오류를 잡을 수 있어 안정성이 높아진다.여러 조건을 조합해도 가독성이 유지된다.페이징과 정렬을 함께 처리할 수 있다.#QueryDSL 주요 기능1. 기본 쿼리 작성Q 클래스는 빌드 시 자동 생성된다.selectFrom으로 테이블을 지정하고, where로 조건을 추가하면 된다.QTodo todo = QTodo.todo;..
9/8
·
TIL
Today I LearnedSpring Boot Security#Spring Security란?Spring Security는 Spring 기반 애플리케이션의 보안(인증/인가)을 담당하는 프레임워크다.로그인, 권한 제어, 세션 관리, CSRF 방어 등 다양한 보안 기능을 제공하며, Filter 기반으로 동작해 요청 흐름을 제어한다. #Spring Security의 사용 목적인증(Authentication): 사용자가 누구인지 확인 (ex. 로그인)인가(Authorization): 인증된 사용자가 특정 자원에 접근 가능한지 확인보안 강화: CSRF, 세션 고정 공격, URL 접근 제어 등 방어유연한 커스터마이징: 로그인 페이지, 권한 처리, 예외 핸들링 등 자유롭게 설정 가능 #Spring Security ..
9/7
·
TIL
Today I LearnedSpring Boot MockMvc#MockMvc란?MockMvc는 Spring MVC 애플리케이션의 Controller 계층을 실제 서버를 띄우지 않고 테스트할 수 있도록 도와주는 테스트 도구이다.내부적으로 DispatcherServlet을 모킹(mocking)하여 HTTP 요청과 응답을 시뮬레이션한다. #MockMvc의 사용 목적- 빠른 테스트: 서버 구동 없이 Controller 로직 검증 가능- HTTP 요청 시뮬레이션: GET, POST, PUT, DELETE 등 다양한 요청 테스트- 응답 검증: 상태 코드, 헤더, JSON 응답 값까지 세밀하게 검증 가능 #MockMvc 주요 기능1. HTTP 요청 시뮬레이션- `perform()` 메서드를 사용해 GET, POST,..
9/6
·
TIL
Today I Learned#JpaRepository @Query 사용법 정리 & 실습 코드이번에 진행 중인 프로젝트에서 단순 메서드 네이밍 기반 쿼리(findBy...)로는 복잡한 조건을 표현하기 어려운 상황이 있었다.특히 다중 조건 + 정렬 + 특정 컬럼만 조회 같은 경우, 메서드 이름이 너무 길어지고 가독성이 떨어졌다.그래서 @Query 어노테이션을 사용해 JPQL 기반으로 직접 쿼리를 작성하는 방법을 공부했다. @Query 기본 개념- JPQL(Java Persistence Query Language) 기반으로 작성한다.- 엔티티(Entity) 이름과 필드명을 사용한다. (DB 테이블명/컬럼명 아님)- 복잡한 조건, 조인, 특정 컬럼만 조회 등에 유용하다.- 파라미터 바인딩 방식 2가지: 위치 기..
9/5
·
TIL
Today I Learned아웃소싱 프로젝트#댓글 조회 / 수정 / 삭제 API 구현현재 진행중인 팀 프로젝트에서 댓글 도메인을 담당하고 있다.이번 프로젝트는 이전과 달리 테스트 코드 작성이 필수이고, 팀 컨벤션과 여러 개발 원칙(단일 책임 원칙 등)을 철저히 지켜야 했기에 짧은 코드라도 작성에 많은 시간이 걸렸다.특히 조회 기능은 단순히 데이터를 불러오는 것을 넘어서 요청사항에 맞춰 여러 조건들을 만족하도록 구현하다보니 많은 고민이 필요했다.처음엔 `CommentResponse` 내부에 `ReplyReponse` DTO를 포함시켜 대댓글을 계층적으로 출력하려 했다.하지만 요청사항은 부모 댓글 사이사이에 대댓글들이 출력되야하는 구조여서 위와 같은 방식으로는 해결이 어려웠다.또한 전체 댓글을 페이징 처리하..
9/4
·
TIL
Today I Learned#Service 테스트1. `@ExtendWith(MockitoExtension.class)` — 순수 단위 테스트Spring 컨텍스트를 로딩하지 않고, Mockito만으로 서비스 레이어를 테스트하는 방식이다.서비스가 의존하는 Repository, 외부 API, 다른 서비스 등을 전부 `@Mock`으로 대체하고, `@InjectMocks`로 테스트 대상 서비스에 주입한다.@ExtendWith(MockitoExtension.class)public class CommentServiceTest { @InjectMocks private CommentService commentService; @Mock private CommentRepository commentRe..
9/3
·
TIL
Today I Learned#Repository 테스트 방식 정리1. `@DataJpaTest` — JPA 전용 슬라이스 테스트가장 널리 쓰이는 방식으로, JPA 관련 Bean만 로딩하여 빠르고 가볍게 테스트 가능@DataJpaTestclass CommentRepositoryTest { @Autowired private CommentRepository commentRepository; @Test void 댓글_저장_테스트() { Comment comment = new Comment("내용"); Comment saved = commentRepository.save(comment); assertThat(saved.getId()).isNotNull()..
9/2
·
TIL
Today I LearnedRESTful한 API 설계란 무엇인가오늘 아웃소싱 프로젝트의 프론트엔드 코드와 요청사항을 전달받고, 팀원들과 함께 API 명세와 ERD를 설계하는 시간을 가졌다.이 과정에서 단순한 RESTful 규칙을 넘어, 실제 설계 시 어떤 기준으로 URI를 나누고, 관계를 표현할 것인지에 대해 깊이 고민하게 되었다. RESTful 설계1. 자원(Resource)의 경계 정의단순히 명사로 URI를 구성하는 것보다 중요한 건 자원의 경계를 명확히 정의하는 것이다.`/users/{id}/posts`는 사용자와 게시글 간의 관계를 표현하지만,이 관계가 단방향인지, 독립적인지, 종속적인지에 따라 URI 구조가 달라질 수 있다.자원 간의 관계를 표현할 때는 “소유” vs “참조”의 개념을 구분해야..
9/1
·
TIL
Today's Codekata# Movie RatingSELECT name AS resultsFROM UsersWHERE user_id = ( SELECT user_id FROM ( SELECT user_id, COUNT(*) AS cnt FROM MovieRating GROUP BY user_id ) AS rating_counts JOIN Users USING(user_id) ORDER BY cnt DESC, name ASC LIMIT 1)UNION ALLSELECT title AS resultsFROM MoviesWHERE movie_id = ( SELECT movie_id FROM ( SELECT movie..