본문 바로가기

개발일지

20231217 - Errors @Valid를 이용한 유효성 검사를 할 때 Errors라는 객체를 이용해 어떤 에러가 발생했는지 확인 후 출력하는 코드를 구성했었다. 그런데 문득 Error와 Exception은 무슨 차이가 있는지에 대한 궁금증이 생겼다. 우선 Error와 Exception 둘 다 Object를 상속받으며 오류나 예외에 대한 메시지를 담을 수 있다. 그리고 담아놓은 메시지를 출력할 수 있다. 하지만 오류는 시스템에 영향을 끼치는 심각한 문제를 뜻하고 이를 미리 예측해서 방지할 수 없다. 하지만 예외는 개발자의 코드에서 무언가의 실수로 인해 발생하는 문제로 이를 미리 예측해서 예방할 수 있다. try-catch와 같은 예외처리를 통해서 문제 수습에 대한 코드를 작성하고 이를 통해 의도한 동작으로 유도 할 수 있다. 하지만.. 더보기
20231214 - 프로그래머스/42840 https://school.programmers.co.kr/learn/courses/30/lessons/42840 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr class Solution { public int[] solution(int[] answers) { int[] answer = new int[3]; List highScorer = new ArrayList(); int[] person1 = {1,2,3,4,5}; int[] person2 = {2,1,2,3,2,4,2,5}; int[] person3 = {3,3,1,1,2,2,4,4,5,5}; in.. 더보기
20231213 - 유효성 검사 클라이언트로 반환하기 회원가입 기능을 구현하면서 유효성 검사를 통해 의도하지 않은 값이 들어올 경우, 메서드가 실행되지 않게 하기로 했다. @Getter public class SignupRequestDto { @NotBlank(message = "아이디를 입력해주세요.") @Pattern(regexp = "^[0-9A-Za-z]*$", message = "아이디는 8~16자 영어 소문자와 숫자만 입력 가능합니다.") @Size(min =3, max = 16) private String username; @NotBlank(message = "비밀번호를 입력해주세요.") @Pattern(regexp = "^[!-~]*$", message = "비밀번호는 8~16자 영어 대 소문자, 숫자, 특수문자만 입력 가능합니다.") @Si.. 더보기
20231212 - JWT를 Header가 아닌 Cookie로 반환하기 JWT를 이용해 인증을 하는 프로젝트에서 포스트맨으로 기능테스트를 해보던 중 응답헤더에서 받은 토큰을 다시 요청헤더에 넣고 요청을 보내는 과정이 여러 번 지속되니 상당히 번거롭기 시작했다. 그래서 토큰을 쿠키로 반환할 경우 포스트맨에서도 자동으로 쿠키로 등록되어 이런 번거로운 과정을 없앨 수 있었다. public void addJwtToCookies(String token, HttpServletResponse response){ try{ token = URLEncoder.encode(token,"utf-8").replaceAll("\\+","%20"); Cookie cookie = new Cookie(AUTHORIZATION_HEADER,token); cookie.setPath("/"); response.. 더보기
20231211 - 백오피스 프로젝트 KPT 회고 Keep 밝은 분위기 덕분에 팀원들끼리 소통을 편하게 할 수 있었다. 자신이 하고싶은 기능을 맡아 구현하는 방식으로 업무를 분담했기 때문에 순조롭게 진행되었다. 기획 단계의 Figma, ERDCloud 등의 협업 툴을 사용하여 진행하였다. git의 organization을 이용해 원활한 버전 관리를 하였다. Merge 시 다같이 리뷰를 한 뒤 Merge를 하였다. 모두가 끝까지 참여해서 프로젝트를 무사히 마쳤다. Problem 기능에 대한 상세한 커밋이 부족한 경우가 있다. API명세서, ERD, 와이어프레임을 계속해서 수정해가면서 진행하였다. 프론트 역량 부족 Try 기획 단계에서 명확한 설계도를 작성한다. 대댓글 기능 구현 로그아웃 기능 구현 프론트엔드 지식을 갖춰 기능을 웹상에서도 확인할 수 있도록.. 더보기
20231211- QueryDSL사용해보기 검색 기능을 구현해 보던 도중 QueryDSL을 이용해서 쿼리문을 작성해 보기로 했다. 아직 완벽하게 이해하고 사용하고 있는 것은 아니지만 몇 번 사용해보다 보니 느낀 게 훨씬 작성이 편하고 보기 좋다는 것이다. @Repository @RequiredArgsConstructor public class PostQueryRepository { private final EntityManager em; private final long limit = 10L; public List findAll(BooleanBuilder builder){ JPAQueryFactory query = new JPAQueryFactory(em); return query .select(QPost.post) .from(QPost.post.. 더보기
20231207 - Spring으로 MultipartFile 받기 게시글 CRUD 기능을 구현하면서 텍스트만 받는게 아니라 이미지파일도 같이 받을 수 있는 기능을 생각해야 했다. 일단 이미지파일을 저장할 DB는 팀원분이 S3를 이용한 방법으로 기능을 구현해 주셨다. 우선 컨트롤러를 살펴보자면 // PostController.java @PostMapping("") public ResponseEntity createPost( @ModelAttribute PostRequestDto postRequestDto, // @RequestBody -> @ModelAttribute @AuthenticationPrincipal UserDetailsImpl userDetails ){ ... } 원래는 @RequestBody 어노테이션으로 json형태로 데이터를 받았지만 MultipartF.. 더보기
20231206 - @CreatedDate, @LastModifiedDate 프로젝트에서 게시물 CRUD 기능 구현을 하면서 게시글의 작성 시간과 수정 시간을 DB에 저장하기 위해 Timestamp 클래스를 따로 만들어서 필요한 Entity에서 사용하기로 했다. @Getter @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public abstract class Timestamped { @CreatedDate @Column(updatable = false) @Temporal(TemporalType.TIMESTAMP) private LocalDateTime createdAt; @LastModifiedDate @Column @Temporal(TemporalType.TIMESTAMP) private LocalDateT.. 더보기