목록프로그래밍 (409)
쌓고 쌓다

테스트 코드를 작성하며 초기 데이터가 필요하여 생성하여 디비에 저장하고 테스트가 끝난후 삭제하는 과정이 필요했다. 쉽게 말해서 테스트 코드를 실행하기 전과 후에 딱 한번 실행할 함수가 필요했다. 거기에 좋은 @BeforeAll, @AfterAll 어노테이션이 있어 사용하려고 한다. 그러나 이 어노테이션들은 static 메서드에 붙이고 사용해야 했다. 왜 static 이여야할까...? JUnit5에서 테스트 클래스의 Life Cycle은 기본값이 PER_METHOD이다. 즉, 테스트 클래스는 하나의 테스트 메서드가 끝나고 다시 클래스가 생성된다. 그래서 static으로 선언해야지 클래스 내부 요소들을 유지할 수 있는 것이다. 다음과 같이 테스트 클래스의 Life Cycle을 클래스단위로 바꿔주자. 다음은 ..

다른 친구가 앱을 만들고 나는 API 서버를 구축하고 있는데 친구가 API 요청시 정상적인 응답을 못주는 상황을 발견했다. 서버에서 요청을 처리하는 코드는 다음과 같다. @PostMapping(value = "/locations/{locationId}/posters") public ResponseEntity addPoster(@Valid @RequestPart PosterRequest posterRequest, @RequestPart(required = false) List files, @PathVariable Long locationId, @AuthenticationPrincipal(expression = "member") Member member) throws IOException {...} Mult..

시큐리티 설정을 통해 인증, 인가 설정을 할 수 있다. 이제 이 인증, 인가에 실패했을 경우에 JSON 예외 응답을 보내보자. SecurityConfig.java http.exceptionHandling(e -> e .authenticationEntryPoint(new JwtAuthenticationEntryPoint()) .accessDeniedHandler(new JwtAccessDenyHandler())); exceptionHandling을 통해 예외를 처리할 로직은 시큐리티에 등록할 수 있다. 인증 예외는 AuthenticationEntryPoint 인터페이스를 구현하여 등록할 수 있고 인가 예외는 AccessDeniedHandler 인터페이스를 구현하여 등록할 수 있다. 먼저 Enum 타입으로 ..

에러 메시지를 보다 깔끔하게 관리하고 응답으로 보낼 수 있는 방법으로 Enum 타입이 있다. 먼저 Enum 타입을 보자. ErrorCode package com.example.spotserver.exception; import lombok.Getter; import org.springframework.http.HttpStatus; @Getter public enum ErrorCode { DUPLICATE_LOGINID(HttpStatus.CONFLICT,"중복된 아이디가 존재합니다."), DUPLICATE_NAME(HttpStatus.CONFLICT, "중복된 닉네임이 존재합니다."), FAIL_LOGIN(HttpStatus.UNAUTHORIZED, "아이디 또는 비밀번호를 잘못 입력했습니다."), NO..

API 서버를 만들며 유효성 검사와 예외 응답에 대한 방법을 고민하다가 생각해낸 방법이다. 먼저 유효성 검사를 쉽게하기위해 spring-boot-starter-validation를 build-gradle에 추가해주자. implementation 'org.springframework.boot:spring-boot-starter-validation' 유효성 검사 간단하게 입력하지 않은 경우의 유효성 검사만 보이겠다. 그 외 다양한 유효성 검사 어노테이션은 찾아보길! 먼저 회원가입시 컨트롤러에서 MemberRequest를 파라미터로 받는다. MemberRequest 클래스는 다음과 같으며 미입력을 방지하고자 미입력을 검사할 필드에 @NotEmpty 어노테이션을 붙인다. @ToString @Setter publ..

Entity 자체를 요청과 응답을 처리하는데 그대로 사용하니 다음과 같은 문제 또는 비효율적인 부분이 발생했다... 먼저 회원 엔티티를 보자. @Entity @Data public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String loginId; private String loginPwd; private String name; @Enumerated(EnumType.STRING) private Role role; @CreationTimestamp private LocalDateTime regDate; @Enumerated(EnumType.STRING) private Memb..

"/login"으로 로그인을 시도하여 System.out.println("로그인 시도한 pwd = " + member.getLoginPwd()); String encodePwd = bCryptPasswordEncoder.encode(member.getLoginPwd()); System.out.println("로그인시 입력한 비밀번호를 인코딩한 결과 = " + encodePwd); 인코딩된 비밀번호 로그를 출력해보았다. 로그인 시도한 pwd = 1234 로그인시 입력한 비밀번호를 인코딩한 결과 = $2a$10$Jr8A352R8VZcfnN/SP5vCubnL2TZSUm4FSNioawR.VZ5X7i2kvldu 로그인 시도한 pwd = 1234 로그인시 입력한 비밀번호를 인코딩한 결과 = $2a$10$Vf/peA..

컨트롤러에서 인증된 회원 정보를 어떻게 받아서 게시글을 쓰고 수정하고 삭제 등등을 할까? 싶었다. 다음과 같은 방법이 있었다. 1. SecurityContextHolder에서 꺼내기 @GetMapping("/get1") public String get1() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); PrincipalDetails principal = (PrincipalDetails) authentication.getPrincipal(); TestUser testUser = principal.getTestUser(); System.out.println("[1] testUser = " + t..