분류 전체보기
-
Spring Security cors 이슈Back-End/Spring 2022. 10. 21. 13:47
사내 오픈마켓 프로젝트를 진행하던 때였다. 나는 인증/인가를 담당하고 있었던 상황이었다 기능 구현을 마치고 프론트 개발자분들과 협업을 진행하던 중, CORS 이슈가 터지고 말았다. GET Method 이외의 HTTP 메서드 요청을 보낼 때 프론트측에서 CORS 오류 메세지를 수신한다는 것을 들었고, 내가 백엔드 서버의 인증/인가 담당을 하고 있었기에(생각해 보니 상관은 없지만) 해결을 시도하였다. 시도한 방안 1. Spring Security filter에 cors 커스텀 설정 적용하기 기존에는 security 필터 체인을 사용 할 때, WebSecurityConfigurerAdapter 추상클래스를 상속받아 구현을 하였는데, 최근에는 deprecated되어 새로운 방법을 적용하는 것을 권장받는다. @B..
-
백준 2096 내려가기Algorithm/DP 2022. 9. 16. 16:20
골드 5 난이도의 dp문제이다. 문제를 처음 읽으면 굉장히 간단한 dp문제로 보인다. max_dp[i][j] => i행 j열까지 내려왔을 때, 점수들의 합이 가장 큰 값 min_dp[i][j] => i행 j열까지 내려왔을 때, 점수들의 합이 가장 작은 값 1. 하지만 메모리 제한이 4MB이기 때문에, max_dp와 min_dp를 넉넉하게 최대값인 100001 * 4로 잡는 순간 메모리 초과가 뜨게 된다. 그래서 조금 더 생각을 해 보면, 딱 2개의 row만 필요함을 알 수 있다. 첫 row는 현재 행 까지의 최대(최소)값 들을, 다음 row는 해당 행 까지의 최대(최소)값을 넣어주고 다음 행을 조사하기 직전에, 마지막 row의 모든 값들을 첫 row로 이동 해 주면 되는 것이다. 따라서, 2 * 3 배열..
-
JPA Auditing과 MappedSuperClass 활용Back-End/JPA 2022. 9. 14. 15:03
프로젝트에서 리뷰, 리뷰 답변 등의 Entity를 설계할 때 생성일자와 수정일자 등의 필드가 공통적으로 들어가게 되었다. 또한 이러한 값들의 경우 매번 insert 및 update 시 값을 설정 해 주어야 한다. 이 때, JPA의 Auditing 기능과 MappedSuperClass 기능을 활용하면 이를 간단히 해결할 수 있다. 공식문서를 보면, JPA Auditing은 다음과 같이 정의되어 있다. In the context of ORM, database auditing means tracking and logging events related to persistent entities 현재 프로젝트에서는 생성 시간과 수정 시간만이 필요하므로 이를 Spring JPA Data의 @CreatedAt, @La..
-
MapStruct 라이브러리 사용법Back-End/Spring 2022. 8. 29. 12:59
Mastruct 라이브러리는 entityToDto 작업을 편리하게 진행 해 준다. DI 프레임워크를 사용하지 않는 경우에도 사용할 수 있으며, Spring과 같은 DI 프레임워크를 사용하면, 인터페이스만 정의 해 두면 빌드시점에 구현체를 만들어 준다. 해당 구현체는 인터페이스에 정의해 둔 정보를 기반으로 매핑 메서드들이 생성된다. 다음과 같이 매퍼를 작성 해 두면, 빌드 폴더에 구현체가 생성이 된다. 1. 특정 Entity를 받아서 특정 Dto로 변환하고자 할 때 => 가장 기본적인 사용 용도이며, 위 그림에서 아래 2개의 메서드처럼 사용하면 된다. 2. 특정 Entity List를 받아서 특정 Dto List로 변환하고자 할 때 => 첫 번째 메서드 정의와 같다. 자체적으로 Entity to Dto 메..
-
JPA에서, Many To One 관계의 Post 요청에서 주의할 점Back-End/JPA 2022. 8. 25. 11:27
Review 테이블이 있고, 리뷰와 함께 보여질 리뷰이미지를 의미하는 ReviewImage 테이블이 있다고 하자. 하나의 리뷰에 여러 개의 이미지를 달 수 있으므로, 이들은 1 대 다 관계이다. 리뷰를 post하는 서비스의 RequestDto는 다음과 같다. { "title" : "맛있어요", "content" : "또 가고 싶습니다.", "reviewImages" : [{ "url" : "https://naver.com" }] } postReview 서비스는 다음과 같다. @Transactional public UUID postReview(CreateReviewRequestDto dto){ Review review = Review.ReviewBuilder() .title(dto.getTitle()) ...
-
JPA의 entity update는 어떻게 이루어질까?Back-End/JPA 2022. 5. 3. 10:04
spring-data-JPA에서, entity에 대해 save 메서드는 있지만 update에 대한 메서드가 따로 없다. 이유는 JPA는 '변경감지'라는 기능을 활용하기 때문이다. 엔티티를 영속 상태로 만들 때, 처음 엔티티의 정보에 대한 스냅샷을 저장을 해 둔다. 이 후, 트랜잭션이 끝날때 까지 해당 정보를 유지하다가, 트랜잭션이 종료될 때(혹은 flush를 날릴 때) 해당 엔티티의 변화를 스냅샷과 비교한 뒤 이를 감지하여 update 쿼리를 자동으로 생성하여 DB에 날리게 된다. @Transactional public void update(Long id, String name){ Member member = memberRepository.findById(id); member.setName(name); ..
-
Querydsl 및 간단한 작성방법Back-End/Querydsl 2022. 4. 21. 05:49
Querydsl이란, JPQL 빌더라고 할 수 있다. JPA를 사용할 때, 다양한 쿼리 방법을 지원하는데(JPQL, JPA criteria, 네이티브 SQL) 그 중 하나라고 할 수 있다. 여기서 JPQL이란 객체지향 쿼리 언어이다. SQL과 그 형식이 비슷하지만, DB의 테이블에 직접 연결되는 것이 아닌 JPA 엔티티에 대해서 동작을 한다. 그래서 JPQL의 쿼리에는 테이블이 아닌 엔티티에서 표현하고 있는 컬럼의 이름을 써 주어야 한다. TypedQuery query = em.createQuery("select m from Member m", Memeber.class); List memberList = query.getResultList(); 여기서, "select m from Member m" 부분이..
-
웹 크롤러 프로젝트 docker-image 빌드하기Back-End/Docker 2022. 4. 11. 15:24
이제 크롤러를 docker 컨테이너화를 해 볼 것이다. 먼저 docker desktop (데몬) 실행 해서 빌드 하려는데, 오류가 뜬다. FROM openjdk:17-jdk-alpine 해당 이미지를 pull 하는 과정에서 오류가 떠서, build시 추가 옵션을 줬더니 해결됐다. 내 맥북이 m1칩을 사용해서, 인텔의 아키텍쳐가 아닌 arm 아키텍쳐를 사용해서 그런 것이었다. 다음으로, build를 통해 jar 파일을 만든다. ./gradlew build 일단 먼저 gradlew파일에 권한을 주어야 한다. chmod +x gradlew 명령어로 권한을 주고 실행하면 - 다음과 같이 compileJava에서 실패 오류가 떴다. 이 에러는 다음 링크에서 잘 설명되어 있다. https://binux.tistor..