목록전체 글 (16)
기록하는 공간
먼저, 이전 글에서 말했듯이, 얼마 전 내가 계획했던 목표를 이루게 되었다.그 목표는 혼자 풀스택 개발을 하는 것이었다. 갑자기 왜 풀스택 개발?풀스택 개발을 진행하게 된 이유는 교내에서 진행한 IT경진대회 때문이었다.처음부터 혼자는 아니었는데… 원래 함께 하려던 팀도 있었고, 친구가 있었는데 참가 조건 때문에 상황이 꼬이면서 혼자 남게 되어버렸다! 새로운 언어와 프레임워크혼자 개발을 하게 되었으니, 어떤 프레임워크를 사용할지 고민이 되었지만 이왕 하는 거, 이번 프로젝트는 내가 하고 싶은 거 다 해보기로 했다. 원래는 자바, 스프링부트를 쓰다가 코틀린, 스프링부트를 사용하였다.짧은 시간이었기에 새로운 언어, 라이브러리를 쓰는 것은 결코 쉬운 도전은 아니었지만 도전에는 이유가 있었다. 코틀린은 학교 강의..
나에게 가장 큰 변화가 있던 시기에서 1년이 지났다. 그냥 기록 용으로 작성하는 느낌이라 두서없는 글이 될 예정이다. 2023 2학년 대학생 개발 공부 시작제대로 된 개발 공부(?)를 시작한 지 1년 정도 되었다. 22년 9월 전역 후 자바 언어 공부와 알고리즘 문제를 풀며 시간을 보내고, 23년이 시작되면서 스프링부트를 공부했다. 인프런의 대표적인 백엔드 강의 영한님의 강의를 보며 시작했다. 아마 백엔드를 시작하려는 분들은 다들 그렇게 시작하지 않을까 싶다. 5월 첫 해커톤강의도 듣고, 알고리즘 공부도 하며 어영부영 5월이 되었을 즈음에, 해커톤이라는 좋은 기회가 있어서 참여하게 되었다. 사실 그 당시 해커톤을 하면서 나는 아무것도 못하고 마무리가 되었다. 같은 팀원들에게 미안할 정도로 아무것도 못했다..
프로젝트 진행 중 customException을 어떻게 관리해야 할까 생각해 보았다. 문제점 현재 ControllerAdvice를 통해 @RestControllerAdvice 어노테이션을 사용하여 전역적으로 예외를 핸들링할 수 있도록 해주었다. 하나의 기능에도 많은 exception이 존재하고, 위의 ControllerAdvice에서도 customException이 많으면 많아질수록 관리가 힘들었다. 해결방법 customException을 그룹화를 해주는 것이다. 그룹화를 하기 위해 RuntimeException을 상속한 추상클래스를 생성해 준다. 이 GroupException은 관련된 다른 exception들을 가진다. 이와 같이 GroupException을 상속한다. 관련한 exception들을 모두..
빌더 패턴… 바로 예시부터 보면서 확인한다. 예시) 실제 사용 중인 코드 Board를 생성한다. @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "board_id") @Schema(description = "아카이빙 Id", example = "1") private Long boardId; @Schema(description = "아카이빙 제목", example = "강아지와 산책한 날") private String boardTitle; @Schema(description..
assertThatThrownBy와 assertThatCode는 무엇인가. assertThatThrownBy(() -> ~~ ) assertThatThrownBy()는 예외가 던져지면 테스트가 성공한다. 예외가 던져지지 않으면 오류가 발생한다. assertThatCode(() -> ~~) assertThatCode()는 예외가 던져지지 않으면 실패하지 않는다. 어떠한 예외도 던지지 않을 경우 assertThatCode(() -> ~~).doesNotThrowAnyException()를 사용하면 된다. 아래의 예시를 보면 이해가 더 쉬울 것이다. 예시 예를 들어 Car라는 클래스가 있다. public class Car { private final String name; private int position..
코드를 짜면서 controller 들을 훑어보았는데, 대부분 @RequestParam을 사용하였다. … 문득 생각이 들었다. @RequestParam은 무엇일까? 왜 이걸 사용하는거지? 내가 이걸 잘 알고 사용하는 건가? 대충은 알고 있다. URL뒤에 ?를 붙이고 key=value 형태로 전달된다는 것을. 근데 또 @PathVariable 이란 어노테이션도 사용가능하지 않나? 어디서 본 적이 있었는데? 둘이 뭐가 다른거지? 그래서 알아보기로 했다. @PathVariable와 @RequestParam 어노테이션은 무엇인가. 💡 클라이언트가 호출한 URL의 파라미터를 받아서 처리하는 어노테이션이다. @PathVariable 이란? 경로 매개변수라고 하고, URL에 직접 포함이 된다. 주로 리소스의 식별자를 ..
JPA에서 다대다 연관관계를 제공한다. @ManyToMany 어노테이션을 사용하는 것이다. 이 글에서는 다대다의 문제점들과 해결책을 설명하고자 한다. 실제로 최근 프로젝트를 진행하면서 사용했던 예시이다 이 코드를 간단히 설명하자면 유저가 스크랩한 공지를 가지고 있기 위해 만들어진 테이블들이다. 유저 테이블과 공지 테이블을 @ManyToMany 어노테이션으로 다대다매핑을 해주었었다. “member_scrap_notice”라는 연결 테이블을 자동으로 생성해 주고 설정해 주니 편리했다. 다대다의 문제점 중간 테이블에는 매핑정보만 들어가고 추가 데이터를 넣는 것이 불가능하다. 중간 테이블이 숨겨져 있기 때문에 쿼리가 예상하지 못하는 형태로 나간다. 실무 비즈니스는 복잡해서 ManyToMany로 풀 수 있는 게 ..
프로젝트를 하다 보면 API요청이 잘 되는지 확인이 필요할 때가 많다. Swagger 같은 프레임워크를 사용할 수 있겠지만, 바로 적용하거나 급하게 할 때는 부담스러울 수 있다. 그래서 대부분 Postman을 많이 써왔을 것이다. 이제는 intelliJ에서도. http를 사용하여 API요청 테스트를 할 수 있다. 이 글에서는 기초만 다뤄보고자 한다. 유저를 등록하고, 등록한 유저를 가져오는 간단한 로직으로 예를 들어 설명하겠다. 매우 간단한 기초만 다룰 예정이기 때문에 궁금한 점은 공식문서를 통해 확인하면 좋을 것이다. https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html HTTP Client | IntelliJ IDEA ..