백엔드 공부 29

querydsl에서 다대다 구현하기. 일대다-다대일(feat. Result Aggregation)

querydsl에서 다대다 구현하기. 일대다-다대일(feat. Result Aggregation) 보통 다대다 매핑을 할 때에는 일대다 - 다대일로 매핑하도록 시킨다. 이 이유는 어차피 JPA에서 만든 후에 이를 처리해주기 위한 중간 테이블을 생성하게 된다. 근데 이 테이블을 사용하는 동안 정체모를 쿼리가 발생할 가능성이 있다. 중간 테이블에도 메타 데이터 등의 추가 쿼리가 필요할 수 있는데, 이를 다대다에서는 개발자가 넣어줄 수 없다. 암튼 그래서... 일대다 다대일로 하는데, 여기서 하나의 파트에서 반대 파트의 데이터를 가져오는 방법을 살펴보도록 한다. 상황 먼저 프로젝트 밈위키 에서는 대충 뭐 이런 느낌으로 "밈 - 태그" 를 갖고 있다. 이는 생각해보면 이렇게 밈과 태그가 다대다로 묶여 있어서 밈..

save랑 saveAll(feat. Transactional)

save랑 saveAll(feat. Transactional) Spring Data JPA를 통해 다양한 쿼링을 쉽게 해줄 수 있다. 근데 만약에 여러 insert를 해줘야 하는 경우가 있다면 어쩔까?? 상황 일단 Spring Data JPA에 대해 안다고 가정한다. 여러 값을 저장할 때에 save방식 넣을값들.forEach( index -> 저장레포지터리.save(index) )이거랑 saveAll방식 저장레포지터리.saveAll(넣을값들);의 차이가 뭘까?? save 일단 save를 한번 본다. saveAll 이제 saveAll을 본다 뭐가 다른겨? 사실 saveAll을 보면 최초에 Transactional 어노테이션 실행 해당 함수 내에서 save함수 실행 저 save는 save함수임 이렇게 간다...

Go와 Gin Framework 를 사용한 게시판 만들기 (2) - Swagger 붙이기

이번에는 Go에서 Swagger를 통해 API명세를 진행해 보겠다. Go는 자바에 비해 좀 귀찮다. 세팅하기 먼저 Terminal상에서 Swagger에 필요한 세팅을 받아줄 것이다. go get -u github.com/swaggo/swag/cmd/swag 그러면 이렇게 알아서 관련된 것들을 module에 추가해준다. swagger가 제대로 설치되었는지 확인하기 위해 한번 관련 명령어를 쳐본다. swag 이거 만약에 쳐봤는데 안나오면 아마 PATH가 제대로 설정되지 않았을 확률이 높다. export PATH=$(go env GOPATH)/bin:$PATH 이거 해보셈.. 이제 gin Framework에 맞춰서 여기 필요한 gin swagger를 받아준다. go get -u github.com/swaggo..

Go와 Gin Framework 를 사용한 게시판 만들기 (1) - 시작하기

목표는 간단한 기능을 가진 게시판 API를 제작하는 것이다. 프론트는 안붙일건데, 이유는 귀찮아서이다 하핫 먼저 처음부터 막 진행하기는 좀 곤란하니까, Go에 Gin Framework를 붙이고 이를 확인하는 것까지 해보려고 한다. 프로젝트 만들기 Go를 통해 간단한 Get API를 만들 예정이다. 먼저 개인 폴더(chan_personal_go)를 만들어 준다. 그리고 그 아래에 main.go 폴더를 만들고, controller를 관리해줄 controller 폴더를 생성한다. 이후 해당 폴더 아래에 controller.go 파일을 생성한다. go는 기본적으로 main.go를 동작시킨다. 이제 메인을 작성해줄 것이다. main.go 작성 package main import ( "github.com/gin-g..

Unable to load class 'com.mysema.codegen.model.Type' error 발생 및 해결

프로젝트 진행 중에 queryDSL을 통한 Q class 생성에서 위와 같은 에러가 발생하였다. 해결을 위해 찾아본 결과 spring boot 2.6이상에서는 querydsl5.0 이상 버전을 적용하고, 추가적인 내용들이 필요하다고 한다. buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'org.springframework.boot' version '2.7.2' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id '..

lucy필터로 xss 방어하기(feat JSON, time, 이모지)

서비스를 실제로 운영할 때에 공격이 들어올 수 있고, 이를 막기 위해 노력해야 한다. 디프만에서 우리는 모든 DB통신을 JPA와 querydsl을 통해 진행했기 때문에 SQL injection은 막을 수 있었다. 그러나 XSS의 경우는 추가적인 방어가 필요했다. 이를 위해 lucy filter를 도입하였고, 우리 프로젝트에 맞춰 추가적인 기능을 부여하며 여러 테스트를 해 보았다. lucy필터의 장점 https://github.com/naver/lucy-xss-filter 네이버에서 만든 XSS 방어용 필터이다. 이를 사용하면 XML설정만으로 XSS방어가 가능해진다. 비지니스 레이어의 코드 수정이 필요하지 않다. 직접 설정할 필요가 없으므로 코드를 잘못 입력하거나, 놓치고 적용하지 않는 경우가 없다. lu..

Git 커밋 컨벤션

깃의 커밋 진행 시 가독성 향상과 협업을 위해, 일관성 있고 원칙을 가진 커밋 메세지를 작성할 필요가 있다. Commit 메세지 구조 Title(제목) type subject Body(본문) Footer(optional)(꼬리말) 제목, 본문, 꼬리말 세 파트로 나누며, 각 파트는 빈칸으로 구분된다. type : subject body footerCommit Type 제목을 구성하는 Type의 경우 어떠한 이유로 커밋을 진행했는지 적는다. 보통의 경우 type의 맨 앞 글자는 대문자로 적는다. Type description Feat 새로운 기능 추가 Fix 버그 수정 Docs 문서 수정 Refactor 코드 리펙터링 Test 테스트 코드, 리펙토링 테스트 코드 추가 Chore 빌드 업무 수정, 패키지 매..

Spring boot를 통한 REST API구현 - 이론(3)

Spring boot로 간단한 rest api를 구현하여 보자!! Spring boot를 통한 REST API의 구현 - 실습(3)에 관한 이론과 내용들에 관한 글이다. 관련 내용 1. Lombok 개념 Lombok이란, 반복해서 사용되는 Annotation을 하나로 묶어서 자동으로 작성해주는 라이브러리이다. 자주 쓰이는 내용들을 한꺼번에 적용할 수 있고 긴 코드를 줄여주기 때문에 생산성에 큰 도움이 되지만, 생각보다 큰 단점이 존재한다. 이 단점에 관해서는 이후에 단점이 발생하게 되는 타이밍에 다시 적겠다. 이게 꼭 그 상황이 터져야 비로소 이해하게 되는 것 같다. 사용 @Data @Getter / @Setter / @ToString / @EqualsAndHashCode / @RequiredArgsCo..

Spring boot를 통한 REST API구현 - 실습(3)

Spring boot로 간단한 rest api를 구현하여 보자!! DTO를 사용한 값 전달, default설정 등 DTO를 사용한 값 세팅 및 전달하기 default값 설정과 required 설정하기 DTO생성 해당 위치에 UserInfoDTO라는 java class를 하나 생성해 준다. import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor public class UserInfoDTO { private String name; private String email; } 해당 클래스의 코드는 다음과 같다. 참고로 여기서 @Data, @NoArgsConstructor을 사용하려면 lombok을 import해줘야 할 것이다. ..

Spring boot를 통한 REST API구현 - 이론(2)

Spring boot로 간단한 rest api를 구현하여 보자!! Spring boot를 통한 REST API의 구현 - 실습(2)에 관한 이론과 내용들에 관한 글이다. 관련 내용 1. Annotation @PathVariable Controller에서 parameter를 받을 수 있는 방법 중 하나이다. http://localhost:8080/users/변수입력 이런 식으로 위치 뒤에 {/변수}를 통해 전달할 수 있다. 주의사항 null / 공백 등이 있는 parameter에는 적용하지 않는다. 값에 { . } 이 포함되면, 그 이후 값은 잘리게 된다. @RequestParam Controller에서 parameter를 받을 수 있는 방법 중 하나이다. http://localhost:8080/users..