ALL Post 204

Springboot + JPA + Querydsl로 좋아요 기능 만들기 1 - 등록

Springboot + JPA + Querydsl로 좋아요 기능 만들기 1 - 등록 개인 프로젝트에 좋아요 기능을 추가했다. Springboot2.3.1, SpringDataJPA, Querydsl을 사용하여 구현했다. 테스트는 JUnit5로 진행했다. 코드는 전체 코드는 github에서 확인할 수 있다. 화면 처리나 환경설정은 이 글에서 다루지 않는다. 내가 생각한 요구사항은 다음과 같다. 사용자는 게시물에 좋아요를 누를 수 있다. 사용자는 자신의 좋아요를 취소할 수 있다. 사용자는 자신이 좋아요를 누른 게시물을 조회할 수 있다. 사용자는 게시물 당 한 번만 좋아요를 누를 수 있다. 사용자는 전체 게시물을 조회할 때 좋아요 카운트를 확인할 수 있다. 우선 구현을 위해 세 개의 엔티티(테이블)가 필요하다..

Spring 2021.02.07

OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000eaaa0000, 178978816, 0) failed; error='Not enough space' (errno=12)

문제 EC2(Amazon Linux2 AMI)서버에서 springboot gradle프로젝트를 ./gradlew test로 테스트하려고 하니 메모리가 충분하지 않다는 에러가 발생헀다. * What went wrong: Unable to start the daemon process. This problem might be caused by incorrect configuration of the daemon. For example, an unrecognized jvm option is used. Please refer to the User Manual chapter on the daemon at https://docs.gradle.org/6.7/userguide/gradle_daemon.html Proces..

ERROR!!!!!!! 2021.01.29

[Gradle Build Error]java.lang.ClassNotFoundException: org.gradle.wrapper.GradleWrapperMain

문제 EC2서버에서 springboot-gradle프로젝트를 다운 받고 테스트를 돌리려고 하면 실패했다 $ ./gradlew test 오류: 기본 클래스 org.gradle.wrapper.GradleWrapperMain을(를) 찾거나 로드할 수 없습니다. 원인: java.lang.ClassNotFoundException: org.gradle.wrapper.GradleWrapperMain이런 에러가 나타났다. 처음에 편법으로 해결한 방법은 Gradle을 설치해서 직접 gradle wrap으로 빌드했다. 하지만 이건 프로젝트가 업데이트되어 Pull해오면 다시 직접 gradle wrap으로 빌드를 해줘야 하는 편법이었다. 그리고 좀 이상했다. gradlew를 쓰는 이유가 gradle설치 없이도 gradle프로..

ERROR!!!!!!! 2021.01.29

Amazon Linux 2 AMI Java 버전 변경

현재 버전 확인 $ java -version openjdk version "1.8.0_272" OpenJDK Runtime Environment (build 1.8.0_272-b10) OpenJDK 64-Bit Server VM (build 25.272-b10, mixed mode)버전 변경 $ sudo /usr/sbin/alternatives --config java 3 개의 프로그램이 'java'를 제공합니다. 선택 명령 ----------------------------------------------- *+ 1 java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.amzn2.0.1.x86_64/jre/b..

infra 2021.01.29

[Security] 현재 로그인한 사용자 정보 가져오기

문제 회원가입 시 인증 메일을 전송하고, 인증 키를 데이터베이스에 보관한다. 인증 API는 URL은 /member/auth/{key}다. {key}와 회원 DB에 저장된 key를 비교하는 절차를 거쳐야 한다. 회원이 인증 API에 요청했을 때 서버는 어떤 회원의 요청인지 알아야 한다. 알아본 방법은 총 세 가지다. 첫 번째 방법 Principal 보다시피 java.security가 제공하는 Pincipal은 로그인한 회원의 아이디(getName())정도만 받아올 수 있다. 회원 아이디로 데이터베이스에서 회원 정보를 불러와서 회원이 가진 인증 키를 사용할 수 있다. 제법 쓸만해 보이지만 한 번 더 셀렉트 해야 한다는 단점을 가지고 있다. 두 번째 방법 @AuthenticationPrincipal 이 애노테..

Spring 2021.01.23

[JPA] 연관관계를 가진 엔티티 save 하기

연관관계를 가진 엔티티 save 하기 insert하려는 테이블이 여러 테이블과 연관관계를 가지고 있을 때 어떻게 해야 할까? Recipe를 추가할 때, 재료는 Ingredient에, 요리 과정은 CookingMethod 테이블에 보관해야 한다. 유형이나 분류는 이미 정해져있는 것을 가져다 사용하면 되므로 제외했다. 프로세스를 짜보자. 사용자 입장에서. 등록하려는 레시피가 어떤 유형인지 선택한다. 등록하려는 레시피가 어떤 분류인지 선택한다. 요리 이름 완성된 요리 썸네일 삽입 간략한 설명 재료를 입력.(여러 개) 요리 과정 입력.(여러 개) 요리 과정 이미지 삽입(여러 개) 이렇게 입력하고 등록했을 때 서버에서 일어나는 일은 입력 받은 데이터를 분류한다. Ingredient를 등록한다. CookingMet..

JPA 2021.01.16

[JPA] @EntityGraph를 OnetoMany에 적용 시 페이징 처리 안 되는 이슈

문제 @Entity public class Recipe { ... @OneToMany(mappedBy = "recipe", cascade = CascadeType.ALL, fetch = FetchType.LAZY) Set ingredients = new HashSet(); @OneToMany(mappedBy = "recipe", cascade = CascadeType.ALL, fetch = FetchType.LAZY) @OrderBy("sequence ASC") Set cookingMethods = new HashSet(); @ManyToOne(fetch = FetchType.LAZY) private FoodNation foodNation; //한중일양식 @ManyToOne(fetch = FetchTyp..

JPA 2021.01.14

8주차 - 인터페이스

목표 자바의 인터페이스에 대해 학습하세요. 인터페이스 정의하는 방법 public interface Service { //final static 변수 //default 메소드 //public static 메소드 public abstract void show(); } 인터페이스는 상수(final static), 추상 메소드, default메소드, public static메소드 이 네 가지만 가지고 있을 수 있다. 자바9부터는 private메소드도 선언할 수 있게 되었다. 인터페이스에 선언된 모든 변수는 상수, default, static, private이 붙지 않은 메소드는 추상 메소드다. 따라서 final static이나 public abstract키워드는 생략 가능하다. 컴파일러가 자동으로 붙여준다. 인..

Java 2021.01.08

7주차 - package, import, classpath, 접근 제어자(access modifier)

목표 자바의 패키지에 대해 학습하세요. 학습할 것 (필수) package 키워드 import 키워드 클래스패스 CLASSPATH 환경변수 classpath 옵션 접근지시자 Package 패키지는 관련된 파일을 넣어둔 폴더와 비슷하다. 패키지란 관련된 클래스들을 묶어서 그룹화 해놓은 것을 하나의 패키지라고 한다. 폴더 안에서 또 관심사를 나누는 폴더가 있을 수 있는 것처럼, 패키지 안에 패키지가 존재할 수 있다. 이를 통해 큰 틀로 묶고, 점점 세분화 하는 방식으로 패키지를 나눌 수 있다. 패키지 안의 패키지는 마침표(.)로 구분한다. java.lang.String str; 패키지는 제공하는 것을 사용해도 되고 새롭게 정의해서 사용해도 된다. 패키지명은 소문자로 만들어서 클래스 이름과 구분할 수 있도록 하..

Java 2021.01.02