목록분류 전체보기 (718)
쌓고 쌓다
API를 작성하고 매번 POSTMAN으로 요청과 응답을 확인해보는 과정은 시간도 많이 들고 번거롭다. 어떤 코드의 수정이나 추가가 일어났을때 모든 시스템의 API가 정상적으로 돌아가는지 확인하기 위해 테스트 코드를 작성해보자. MockMvc를 설정하고 초기화 시키는 코드는 다음과 같다. @SpringBootTest @Transactional @TestInstance(TestInstance.Lifecycle.PER_CLASS) class MemberControllerTest { private MockMvc mockMvc; @Autowired private WebApplicationContext webApplicationContext; @BeforeAll public void beforeAll() throw..
테스트 코드를 작성하며 초기 데이터가 필요하여 생성하여 디비에 저장하고 테스트가 끝난후 삭제하는 과정이 필요했다. 쉽게 말해서 테스트 코드를 실행하기 전과 후에 딱 한번 실행할 함수가 필요했다. 거기에 좋은 @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..
https://school.programmers.co.kr/learn/courses/30/lessons/181187 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 방법 1사분면의 점들의 개수를 구해 *4를 해주면 모든 점들의 개수를 구할 수 있다. 작은 원과 큰 원 사이의 점들을 구하기 위해 원의 방정식을 사용한다. x는 1부터 r2까지 반복문을 돌리며 각 원의 높이 y를 구한다. 구한 y를 각각 내림과 올림을 해준다. r1 ceil, r2 floor 하는 이유 : r1보다 크거나 같고 r2보다 작거나 같은 구간의 정수를 구해야하기 때문에 r1을 올..