java 84

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

[JAVA] CRU API

회원등록 API를 만들때 controller에서 entity를 파라미터로 받아서 사용하지 말자. entity는 굉장히 여기저기서 사용되므로 이름이 바뀌거나 하기 쉽다. 근데 이때 이름이 바뀌면 API 스펙이 바뀌므로 API가 작동이 안될수 있다. 따라서 API 를 개발할 때는 controller 에서 DTO를 사용하자! @RestController // Controller + ResponseBody -> 데이터를 바로 json이나 xml로 보내자! @RequiredArgsConstructor public class MemberApiController { private final MemberService memberService; @PostMapping("/api/v1/members") public Cre..

JAVA 2022.05.17

신규아이디 추천

카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게되었다. 주어진 임무는 새로 가입하는 유저들이 아이디 규칙이 맞지 않는 아이디를 입력했을 시, 입력된 아이디와 유사하면서 규칙에 맞는 아이디를 추천해주는 프로그램 개발 프로그램은 아래 7단계를 거쳐야 한다. new_id의 모든 대문자를 대응되는 소문자로 치환합니다. new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거 합니다. new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다. new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다. new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다. new_id의 길이가 16..

CT 2022.04.19