0. 개요vscode는 아무래도 자바만을 위한 툴이 아니고 기본적으로 확장 기능으로 요소들을 추가해나가는 느낌이라 인텔리제이에서는 겪은적없는 문제들이 가끔씩 발생하는데 특히 SpringBoot에서 Gradle로 사용할때 자바 클래스 경로가 안잡힐때가 있어서 이에 대해 알아보자 1. 해결법일단 해결법은 Ctrl + Shift + P로 명령어 팔래트를 열고 Java: Clean Java Language Server Workspace 를 찾아 누르는 것이다.자바의 워크스페이스 초기화를 통해 꼬여버린 캐시를 정리하고 다시 재정립해준다. 2. 해결법 2만약 gradle을 쓰고있는데 위의 해결법으로 해결이 안된다면 Gradle 프로젝트 새로고침를 한번 해보자
BackEnd/SpringBoot
0. 개요릴스에서 REST에 대한 개념적인 영상으로 다음과 같은 주제의 영상이 나왔고, 나는 댓글에 들어갔다. 당신의 API v1은 GET /getUserById?id=5 입니다.v2는 GET /users/5 입니다.당신의 테크 리드(개발 팀장)는 v1이 잘못되었다고 말합니다.두 방식 모두 같은 데이터를 반환하고, 잘 작동합니다.왜 URL 구조가 실제로 중요한 것일까요? 댓글AAA: 둘 다 잘못되었습니다. 열거 공격(enumeration attacks)을 방지하려면 사용자를 조회할 때 항상 UUID를 사용해야 합니다.BBB: 숫자 5를 실제 UUID나 CUID 등을 나타내기 위한 단순 예시(placeholder)로 볼 수도 있잖아요. 전 이게 그렇게 나쁘다고 생각하지 않아요.AAA: 사람들에게 무엇이 "..
0.의존성 추가implementation 'org.springframework.boot:spring-boot-starter-amqp' 0.Docker rabbitmq: image: rabbitmq:4.0-management container_name: rabbitmq restart: always environment: RABBITMQ_DEFAULT_USER: guest RABBITMQ_DEFAULT_PASS: guest ports: - "5672:5672" # AMQP 통신 포트 - "15672:15672" # Management UI 포트 (브라우저 접속용) volumes: - rabbitmq_data:/var/lib..
1. 통합테스트란하나의 부품이 아니라, 전체가 잘 조립되어 돌아가는지 확인하는 테스트이다.단위테스트가 메서드 하나에 대해서만 테스트 한다면 통합테스트는 요청-> Controller -> Service -> Repository -> 실제 DB까지의 로직을 한번에 검증합니다. 2. 왜 통합테스트가 필요한가?통합테스트가 필요한 이유는 메서드들이 단위 테스트에서 정상적으로 작동하더라도 SQL 쿼리가 잘못되었거나 DB 제약조건때문에 실패하는 경우도 있고, 메서드끼리의 흐름이 정상적으로 이뤄지는지 확인해야하기 때문이다. 3.MockMvc 단위테스트에서도 테스트하기위한 메서드외에는 가짜 객체를 만드는 Mock을 사용했었는데,통합테스트에서는 HTTP 요청을 보낼 수 있게 해주는 가짜요청하게 해주는 ..
0. 상황최근 프로젝트에서 유저가 특정 기능을 신청하는 API를 구현하고 있었습니다. 기획 요구사항은 명확했습니다. 신청 상태가 '대기(PENDING)인 요청은 요청자당 하나만 존재해야 한다는 것이었습니다. 즉, 이미 심사 중인 건이 있다면 중복으로 신청할 수 없도록 막아야 했습니다. 그래서 서비스계층에서 비즈니스 로직을 통해 이를 검증하도록 코드를 작성했습니다. DB에서 해당 유저의 PENDING 상태인 요청이 존재하는지 조회하고, 만약 존재한다면 예외를 던져 요청을 거부하도록 처리했습니다. 하지만 동시성에 대한 생각을 하게되었습니다. 1. 동시성이란싱글 코어 혹은 멀티 코어 환경에서 여러 작업이 번갈아 가며 실행되어, 마치 동시에 실행되는 것처럼 보이는 성질인데지금은 동시에 신청 API를 받아..
1.QueryDSL 이란?타입 안전한 쿼리를 자바 코드로 작성할 수 있게 해주는 프레임워크이다. 기존 JPA에서 @Query로 JPQL을 직접 이렇게 작성했다.이렇게 작성한 쿼리문은 런타임까지 문법오류를 알수없다는 단점이 있었다....@Query("SELECT m FROM Member m WHERE m.username = :username")List findByUsername(@Param("username") String username); 반면 QueryDSL은 Q클래스를 활용하여 코드기반으로 작성하기 때문에 컴파일 시점에서 오류 체크가 가능하다.QMember member = QMember.member;List result = queryFactory .selectFrom(member) ...
1.204 No Content204 코드에 대한 설명을 MDN 플랫폼에서는 다음처럼 정의하고 있다.HTTP 204 No Content 성공 상태 응답 코드는 요청이 성공했으나 클라이언트가 현재 페이지에서 벗어나지 않아도 된다는 것을 나타냅니다. 2. 404 Not Found404 코드에 대한 설명을 MDN 플랫폼에서는 다음처럼 정의하고 있다.HTTP 404 Not Found 클라이언트 오류 응답 코드는 서버가 요청받은 리소스를 찾을 수 없다는 것을 의미합니다. 404 페이지를 띄우는 링크는 대체로 브로큰 링크(broken link) 또는 데드 링크(dead link)라고 부릅니다. 3. 204 와 404사용에 대한 의문현재 대학교 동아리에서 개발중인 웹사이트를 개발자도구를 키고 살펴보며 단건 조회에..
1.NULL 이란?NULL은 값이 없음을 나타내는 문자이다. (참조가 아무 객체도 가리키고 있지 않다.)사실 맨 처음 프로그래밍을 배울때 NULL의 개념에 대해 들으면, 이게 뭔지 햇갈릴수 있다. 여기 간단한 예시용 사람 클래스가 있다. class Person { private String name; public Person(String name) { this.name = name; } public String getName() { return name; } public void sayHello() { System.out.println("안녕하세요! 제 이름은 " + name + "입니다."); }} 그리고 이제 사람들의 리스..