전체 글
dsl 에 subquery 사용 경험
토이 프로젝트를 진행 하던중, dsl에서 subquery를 사용할 일이 생겼다. 내가 구축한 DB ERD는 위 사진과 같은데 이중 vote와 posting의 관계에 있어서 문제가 있었다. 좋아요의 경우 vote.liked에 1 싫어요의 경우 vote.liked에 -1 이 들어가는 모델을 생각하고 DB를 구현 했었는데, 좋아요 개수로 where 절에 제약을 만드는 경우는 subquery가 정상적으로 작동했다. private BooleanExpression filterByLikes(Integer likes) { if (likes == null) { return null; } return JPAExpressions .select(vote.count()) .from(vote) .where(vote.posting..
Git Action을 사용한 CI/CD에서 Spring Boot 설정 파일 숨기기
프로젝트를 진행 하던중, CI/CD를 구축해야할 상황이 생겼었다. 위 사진과 같이 단순히 Git Action과 AWS의 S3,CodeDeploy를 이용해 구축했고, 문제없이 CI/CD 구축이 되었었다. 사실 처음 해보는 CI/CD 이기도 하고, 작은 프로젝트이다 보니 설정파일(application.properties)를 숨기기 보다 public에 올려서 사용하기 위해 데이터베이스도 서버컴퓨터 로컬로 돌리고, 민감한 값이 안들어 가게끔 시도했다. 문제는 이후에 사진 업로드를 위한 S3버킷을 자바 코드 내에서 사용하게 되었을때 이다. 사진 업로드를 위해 설정파일에 민감한 API가 필수로 들어가야 했고, 이를 해결하기 위해 몇일간 공부해보고 찾아보고 해결하려 노력했지만 정말 어려웠다. 공부를 하면서 githu..
JPA SQL 오류 경험
좋아요 싫어요 기능을 구현 하던중 예상치 못한 JPA SQL오류에 시달렸다. DB구조는 위 사진과 같았고, 가장 처음 마주친 오류는 you have an error in your sql syntax; check the manual that corresponds to your mariadb server version for the right syntax to use near {SQL 쿼리} 위와 같은 오류였다. 쿼리문이 오류라는 말인데... 분명 JPA관련 Entity나 Repository는 문제가 없었다. 이것저것 찾아보다 보니 커뮤니티 에서 정답을 찾을수 있었다. 바로 Like 테이블이 문제였다. @Table(name="like") 테이름 이름이 like로 JPA가 쿼리를 만들고 실행하는 과정에서 li..
HashTag 검색 SQL 구현해보기
커뮤니티 기능을 만들어 보면서 커뮤니티를 제작&검색 할때 HashTag를 활용해 보기로 했다. 데이터 베이스는 아래와 같다. 커뮤니티를 만들때 해쉬테그를 만들거나 등록하고, 검색할수 있는 SQL을 구현해보았다. 처음엔 아래와 같이 짜 보았다. SELECT c.*, Group_concat(h.ht_name) FROM cm c, ht h WHERE c.c_key = ANY (SELECT c_key FROM tr WHERE ht_id = (SELECT ht_id FROM ht WHERE ht_name = '귀여움주위')) GROUP BY c_key; HashTag를 검색했을때 관계테이블을 통해 포함하고있는 커뮤니티(c_key)를 Any를 통해 전부 받고 그룹 관련된 정보들과 Group_concat 을 통해 커..
Spring security 시작하기
About spring security 스프링 시큐리티는 애플리케이션을 보호하기 위해 사용되는 프레임워크입니다. 기본적으로 인증(Authentication)과 권한 부여(Authorization) 기능을 제공합니다. 인증은 사용자가 누구인지 확인하는 것을 말하며, 권한 부여는 사용자가 어떤 작업을 수행할 수 있는지를 결정합니다. 스프링 시큐리티를 사용하면 인증과 권한 부여를 쉽게 구현할 수 있습니다. Start spring security 스프링 시큐리티를 사용하기 위해서는 먼저 스프링 부트 프로젝트에 필요한 의존성을 추가해야 합니다. 이를 위해 build.gradle 파일에 spring-boot-starter-security를 추가하면 됩니다. dependencies { implementation 'o..
MockMVC
MockMVC는 Spring MVC 프레임워크에서 사용되는 테스트 헬퍼 클래스입니다. 이 클래스를 사용하면 컨트롤러에 대한 테스트를 쉽게 수행할 수 있고, 실제 서블릿 컨테이너를 구동하지 않고도 컨트롤러에 대한 테스트를 수행할 수 있습니다. MockMVC를 사용하면 테스트에서 컨트롤러에 대한 요청과 응답을 쉽게 처리할 수 있으며, 이를 통해 컨트롤러가 올바르게 작동하는지 확인 할 수 있습니다. Spring MVC 애플리케이션에서 MockMVC를 사용하려면 먼저 MockMVC 클래스의 인스턴스를 생성해야 합니다. 이를 위한 방법은 여러 가지가 있지만, 가장 일반적인 방법은 standaloneSetup() 메소드를 사용하는 것입니다. 이 메소드는 Spring MVC 테스트 헬퍼인 MockMvcBuilders..
Java Builder pattern
Builder Pattern 빌더 패턴은 객체를 생성할 때 생성자가 여러 개의 인자를 가질 때 사용할 수 있는 객체 생성 패턴입니다. 빌더 패턴을 사용하면 인자가 많은 생성자를 사용할 때 인자를 쉽게 설정할 수 있습니다. 빌더 패턴을 사용하려면 우선 클래스의 인스턴스를 생성할 수 있는 빌더 클래스를 정의해야 합니다. 빌더 클래스는 생성자의 인자들을 필드로 가지고 있으며, 각각의 필드에 대해 setter 메소드를 정의합니다. 이렇게 정의된 빌더 클래스를 사용해 객체를 생성할 때는 인스턴스를 생성할 때 원하는 필드만 설정해서 생성할 수 있습니다. 예를 들어, 아래와 같은 피자 클래스가 있다고 가정해봅시다. public class Pizza { private final int size; private fina..
SpringBoot JPA 사용하기
Gradle 추가(web,jpa,mariadb,lombok) implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.mariadb.jdbc:mariadb-java-client:3.0.6' compileOnly 'org.projectlombok:lom..