백엔드 공부 23

SLASH22의 왜 은행은 무한스크롤이 안되나요 영상을 보고..

카카오 브런치에서 백엔드를 담당하고 있는데, 거기서 연재 작품 전체 라는 슬롯에서 무한스크롤을 적용해 보았다. 그리고 우연한 계기로 토스뱅크에서 무한스크롤을 도입한 계기가 있어서 이를 살펴 보았는데, 좀 신기하고 재밌어 보였다. SLASH22의 왜 은행은 무한스크롤이 안되나요 를 보고 정리해 보았다. 상황 보통 은행앱이 조회기간 설정을 한다(1주일, 1개월, 6개월 등등...) 그리고 지정된 기간만큼이 쫘라락 조회되는(그만큼만) 방식이다. -> 즉 스크롤은 있는데 무한스크롤로 페이지 조회 후 넘어가는 이런게 없다. 상황 이해 이 이유를 알려면 은행 시스템에 대한 이해가 필요한데 은행 앱 - 채널계 - 계정계 은행 시스템은 이렇게 분리되어 있다. 계정계는 실제로 유저의 돈을 다루며 원본 데이터가 저장되는 ..

백엔드 공부 2024.04.20

채널(channel), 컨텍스트(Context)

채널(channel), 컨텍스트(Context) 이전에 고루틴을 나누는 방법을 보았는데, 동시성을 제어하는 방법들을 살펴봤다. 그리고 거기서 역할을 나누는 것이 있었고... 이 때에 쓰이는게 채널이다. 채널 : 고루틴끼리 메세지를 전달할 수 있는 메세지 큐 데이터를 FIFO로 넣고 -> 빼고 이렇게 하는거임 이거 다른말로 Thread-safe Queue이다. 채널의 크기 기본 크기 0 처음 만들면 크기가 0으로 생성된다. 그리고 make(chan int, 20) 이런 식으로 크기를 정해줄 수 있다(이러면 20개짜리 크기) 이거 그래서 채널 만들어놓고 데이터 넣은 다음에 안빼주면 무한히 대기하게 된다ㄷㄷ 이런것을 좀비 고루틴, 록은 고루틴 릭이라고 하는데(채널을 닫아주지 않아 무한 대기를 하는 고루틴) 이..

Springboot3.0에서 [Spring] Could not resolve all files for configuration ':classpath'. 해결하기!!

Springboot3.0에서 [Spring] Could not resolve all files for configuration ':classpath'. 해결하기!! Springboot3.0이 나왔다!! 근데 이거를 깃에서 클론받아서 쓰려하면 Could not resolve all files for configuration ':classpath'. 요런 에러가 나면서 안될때가 있다. 이게 안되는 이유는 아마 JDK버전 문제일 가능성이 크다. 왜냐면 Spring Boot 3.0 이상 버전에서는 JDK17이상만 지원하기 때문! 그니까 당신의 컴터는 다른 JDK인데 필요한게 JDK17이상이기 때문 해결법 IntelliJ의 preference에 들어가서 cmd + , Build, Ex..

spring boot의 self invocation, 이유와 해결법

spring boot의 self invocation, 이유와 해결법 회사에서 개발하는데 캐싱과 관련하여 self invocation 관련해서 이슈를 들었다. 그래서 한번 찾아보게 되었다. invocation 이거는 메서드 호출이라고 생각하면 된다. self-Injection?? 일단 문제상황에 대해 알아본다 다음과 같은 코드를 작성한다. (그리고 캐시 설정은 되어있다고 가정한다.) Ryoochan.java import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; @Entity public cl..

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..