Spring Boot 14

[spring] 스프링 부트에서 Email 보내기 구현

스프링에서 손쉽게 메일을 보내주는설정값을 implementation group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '2.6.3'implementation group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '2.6.3' build.grable에 한줄 추가해준다. 그다음 application.yml파일에 서 설정값을 넣어준다. spring: mail: host: smtp.gmail.com port: 587 username: {구글 아이디} password: {앱 비밀번호} properties: mail: smtp: auth: t..

Spring Boot 2022.08.08

[에러]H2에서 User 테이블 생성시 에러 해결법

@Entity @Getter @Setter @NoArgsConstructor public class User extends BaseEntity{ 이와 같이 User클래스를 h2에 테이블을 만들려고 할떄 o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDLcreate table user 이와 같은 에러가 나타난다. 구글링을 해보니 user라는 이름이 h2에서 예약어 일수 있다고 한다. @Entity @Getter @Setter @Table(name = "\"User\"") @NoArgsConstructor public class User extends..

Spring Boot 2022.08.06

[spring] Spring Mail AuthenticationFailedException 해결

org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 534-5.7.14 계정 -> 보안 -> 2단계 비밀번호를 설정 -> 앱비밀번호 발급 생성 버튼을 눌러주면 앱비밀번호를 발급받을수 있다. 발급받은 번호를 Application.porperties에 넣어주면 이메일 전송을 정상적으로 이용할수 있다. AdminMail.id=~~@gmail.com AdminMail.password="발급받은 앱비밀번호"

Spring Boot 2022.05.08

[spring] 위도 경도를 받아서 Point형으로 db에 저장하기(Mysql 위치데이터)

현재 프로젝트를 하던중에 위치서비스를 구현하려고 프론트에서 현재 사용자의 위치정보를 보내면 db에 저장을 하는 로직이 있습니다. 위치정보는 처음 다뤄보는경우이기 떄문에 먼저 리엑트네이티브에서 어떤식으로 보내는지를 살펴보았습니다. Geolocation.getCurrentPosition함수를 사용하면 { coords: { accuracy:5, altitude:0, altitudeAccuracy:-1, heading:-1, latitude:37.55, longitude:127.0165, speed:-1,} ,timestamp:1597336350546.098, } 이런식으로 결과값을 보내는것을 확인하고 그럼 프론트에서 는 위도,경도만 파싱후에 보내줄거라고 생각을 했습니다. @Data public class Ca..

Spring Boot 2022.03.20

[spring] MultipartFile을 Bufferimage로 받아서 S3에 업로드하기

기존에는 MultipartFile을 파일로 저장을시킨후에 업로드를 하고 삭제하는 방식으로 진행을 하였습니다. 하지만 첫번째장을 썸네일로 만드는 작업을 하려고하면 잘 안되는 문제가 발생을 하여서 file저장 방식이 아닌 bufferimage로 받아서 파이프라인을 타게끔 변경을 하였습니다. 기존 방법이 궁금하신분은 이 곳을 보고 와주세요. 먼저 껀쮸롤러를 먼저 보겠습니다. @PostMapping public ResponseEntity createProduct( @RequestHeader("Authorization") String accessToken, @RequestPart(value = "file") List multipartFile, @RequestPart(value = "product") @Valid ..

보고도 믿지못한 카카오 API호출 4만6천번..

떄는 01/17일 12시쯤 개발은 뭔가 하기 싫고 열심히 딴짓을 하던중에 진행중인 프로젝트가 카카오 로그인을 지원하는 웹을 만들고 있었습니다. 01/12일도 역시나 백엔드 개발을 했었습니다. 하지만 api요청 건수가 4만6천번이라는 믿기 힘든 숫자가 나왔고 처음에는 팀원들에게 공유를 하면서 뭔가 카카오 서버에서 오류일거라고 다들 생각했습니다. 하지만 진짜 에러 일까 궁금하기도 해서 카카오 개발자내에 데브커뮤니티에서 카카오측 답변가들에게 질문을 해보았습니다. 돌아온 답변은 정상 서비스단에서 구현을 한 public void isValidToken(String accessToken) { validateTokenExists(accessToken); String vaildCheckHost = "https://ka..

상품 조회 중에 만난 N+1문제

N+1문제란? JPA로 개발을 하면 자주 접하는 문제이다. 하위 엔티디들을 첫번쨰 조회할떄는 코빼기도 안보이다가 Lazy로 되어 있는 놈들은 필요할때가 되면 그제서야 조회를 시작한다. 시작할때 한방에 Eager로 조회를 하면 sql문을 많이 날릴필요가 없다. 저번 포스팅에서 작성한 페이징 처리를 위해서 작업을 마치고 조회 쿼리문을 세어보니 총 12번의 쿼리문이 나갔다. Page findProductsByProductIdIsLessThanOrderByCreatedAtDesc(Long productId, Pageable pageRequest); 결과 2022-01-18 21:55:57.772 DEBUG 7944 --- [nio-8080-exec-2] org.hibernate.SQL : select 1번 pr..

Spring boot 에서 AWS S3 버킷 업로드 파일 확장자 구분해서 업로드 해주기

아거 프로젝트에 파일을 저장하는 부분을 고민하다가 S3에 업로드 하여 업로드된 파일의 URL을 DB에 저장을 하기로 회의를 통해서 결정 하게 되었습니다. S3는 AWS에서 제공을 하는 객체 스토리지 서비스입니다. 쉽게말해서 도라에몽 주머니 처럼 아무거나 다들어가는 만능 주머니 입니다. 그래서 Springboot를 이용하여 AWS S3에 파일 업로드에 대한 포스팅을 해보려고 합니다. S3버킷 만들기는 다른 블러거분들이 올린 좋은 글들을 참고해서 만들어 주시면 될것같습니다. 버킷을 만들고 IAM키를 만들었다는 가정하게 진행을 하겠습니다. S3에 아무파일이나 올리면 안되기때문에 이미지만 올리게 s3의 권한정책을 변경해보겠습니다. 아거에서는"png","jpg","jpeg"만 업로드 하게 설정하였습니다. 버킷 정..

spring-boot 프론트엔드와 무한 스크롤 구현 하기[ep.2]

spring-boot 프론트엔드와 무한 스크롤 구현 하기[ep.1] spring-boot 프론트엔드와 무한 스크롤 구현 하기[ep.1] 왼쪽은 페이징 표시 오른쪽은 무한 스크롤 기능입니다. 페이징 표시는 웹에서 사용하기 적합하지만 현재 만들고 있는 서비스는 모바일 웹에 특화된 서비스 이므로 무한 스크롤 기능을 적용을 thisisthat-it.tistory.com 지난번에 구현한 페이징 처리는 정말 단순하게 페이지 처리만 해준것입니다. 문제점이 있다면 사용자가 조회할때 다른 사용자가 상품등록을 해주어서 DB에 상품 데이터가 1개가 추가된다는 상황에서 문제점이 발견이 됩니다. 간단하게 이해를 쉽게 하기 위해서 그림을 첨부해보겠습니다. https://github.com/a-ger/a-ger-backend/is..

spring-boot 프론트엔드와 무한 스크롤 구현 하기[ep.1]

왼쪽은 페이징 표시 오른쪽은 무한 스크롤 기능입니다. 페이징 표시는 웹에서 사용하기 적합하지만 현재 만들고 있는 서비스는 모바일 웹에 특화된 서비스 이므로 무한 스크롤 기능을 적용을 해야합니다. 추후에는 앱으로도 만들어야겠다. 페이징 기능은 JPA에 Page로 반환을 해주면 간편하게 구현을 할수 있습니다. Pageable로 값을 넣어주면 Db에서 데이터를 처음부터 끝까지 카운팅을 해준다음 pageable에 들어있는 size와 page를 보고 알아서 page에 대한 내용을 처리해줍니다. 여기서 size는 페이지에 보여줄 데이터 갯수입니다. 만약에 size: 3, page: 0 이라고 하면 0번째 페이지에 3개의 데이터를 불러와라 라고 볼수 있습니다. 이런식의 페이지 처리는 만약에 그냥 findAll이라면 ..