분류 전체보기 126

error serializer

json → object로 변환하는과정 (deserialization) object → json로 변환하는과정 (serialization) 객체는 javaBean 스펙을 준수하고 있어서 BeanSerializer로 json으로 변환이 가능하다. but, errors는 그 스펙을 준수하고 있지 않아 json으로 변환하려면 직접 serializer를 생성해줘야한다. 만약 아래처럼 테스트 코드 작성 시 jsonPath에 지정해준 필드를 응답값으로 받고싶다는 것이다.(Errors에서) 하지만 Errors는 json으로 변환이 불가하기 때문에 ErrorSerializer를 생성해준다. this.mockMvc.perform(post("/api/events") .contentType(MediaType.APPLICAT..

JAVA 2022.07.11

testcode 작성 시 description

testcode 작성 시 메소드명만으로는 자세하게 구별할수가 없다. 따라서 설명 및 이름 같은 것을 붙여주어 구분하기 쉽게 한다. junit4 사용 시 : junit4는 설명을 달기 위해서 따로 annotation을 만들어야한다. package me.whiteship.restapi.common; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) // 붙일수 있는 target은 메소드!! @Retention(Retentio..

JAVA 2022.07.11

String vs StringBuffer vs StringBuilder

String : 문자열 연산이 적고 멀티쓰레드 환경일때 (문자의 변동이 적을때 - 불변성) String의 예시로 아래 코드를 살펴보자. (hello로 선언한 값을 hello world로 바꿔주는 예) 기존에 hello라는 값을 가지고 있던 memory영역이 있고 hello world는 새로운 영역에 할당된다. 그렇다면 처음에 할당된 hello가 담겨있는 메모리 영역은 Garbage로 남아있다가 GC(Garbage Collection)에 의해 사라지게된다. String 클래스는 불변하기 때문에 기존의 memory영역이 수정되지 않고 새로운 영역이 생성되는것 String str = new String("hello"); str = str + " world"; 만약 문자열 추가, 수정, 삭제 등의 연산이 많은 ..

JAVA 2022.07.05

spring boot 프로젝트 생성과 사용 이유

spring boot 프로젝트 생성 시 아래 url 주소에서 생성 이때 spring boot 버전을 고를수 있는데 버전 옆에 snapshot 이 붙은건 아직 만들고 있는 단계, m1 이런건 정식 릴리즈가 되지 않은 단계, 아무것도 안붙어있는게 정식 릴리즈 된것 웬만하면 정식 릴리즈된 버전을 선택하자! 여기서 사용되는 gradle은 버전 설정하고 라이브러리를 땡겨오는 역할이라는 정도만 이해하자! https://start.spring.io/ dependencies를 선택하고 generate 누르면 프로젝트 생성! ※ 참고사항 프로젝트 폴더 중 .idea는 intellij가 사용하는 설정파일 gradle/wrapper/는 gradle과 관련된 폴더라고만 알고 지나가기 build 시 더 빠르게 웹서버를 띄우고 ..

JAVA 2022.07.04

[JAVA] API 구현 시 테스트 개발

@WebMvcTest MockMvc 빈을 자동 설정 해준다. 그냥 가져와서 쓰면 됨. 웹 관련 빈만 등록해준다. @MockMvc 스프링 MVC 테스트 핵심 클래스 웹 서버를 띄우지 않고도 요청을 처리하는 과정을 확인가능 → 컨트롤러 테스트용으로 자주 쓰임 테스트 내용 1. 입력값들을 전달하면 JSON 응답으로 201 값이 나오는지 확인 - Location 헤더에 생성된 이벤트를 조회할 수 있는 URI 담겨있는지 확인 - id는 DB에 들어갈 때 자동 생성된 값으로 나오는지 확인 @RestController @ResponseBody를 모든 메소드에 적용한 것과 동일 ResponseEntity를 사용하는 이유 응답코드, 헤더, 본문, 모두 다루기 편한 API Locatio..

JAVA 2022.06.02

폰켓몬

N 마리의 폰켓몬이 있으면 최대 N/2 마리를 데려갈수 있다. 이때 N마리중 중복이 포함되어있을수 있고 이때 가장 많은 종류의 폰켓몬을 데려갈 수있는 경우의 수를 반환하라. 어차피 중복되는 경우의 수는 빠져야하니까 배열의 중복을 없애야겠다고 생각했다. 또한 중복을 없애고 난 후의 배열의 크기가 최대 경우의 수와 같다고 생각했다. 주어진 N을 2로 나눈값의 갯수의 포켓몬만 데려갈수있다는 점에서 중복을 제거한 배열의 값의 사이즈 > N의 크기/2 의 값 이 되면 N의 크기/2가 최대 경우의 수라고 생각했다. import java.util.HashSet; import java.util.ArrayList; class Solution { public int solution(int[] nums) { int answ..

CT 2022.05.26

[JAVA] 지연로딩과 조회 성능 최적화

주문 + 배송정보 + 회원을 조회하는 API를 만들자 지연 로딩때문에 발생하는 성능 문제를 단계적으로 해결해보자. 1. 엔티티를 직접 노출 (실무에서는 엔티티를 노출하는 일은 없으니 가볍게 보고 넘기기로 하자.) @GetMapping("/api/v1/simple-orders") public List ordersV1(){ List all = orderRepository.findAll(); return all; } 위에 코드는 엔티티를 직접 노출하는 개발 방식 양방향 연관관계일때 문제가 생김 → 무한루프에 빠져버림 (잘못된 코드) 이러한 경우 양방향이 걸리는데를 다 @JsonIgnore 를 걸어줘야함 → 그렇다면 무한 루프가 생기는 일은 피할 수 있지만 지연로딩 관련한 문제는 해결되지 않는다. 지연로딩으로 ..

JAVA 2022.05.19