전체 글 123

3. 영속성 관리 - 내부 동작 방식

영속성 관리 - 내부 동작 방식 영속성 컨텍스트 영속성 컨텍스트 : "엔티티를 영구 저장하는 환경"이라는 뜻. EntityManager.Persist(entity); EntityManager를 통해서 DB에 저장하는 것이 아닌 영속성 컨텍스트에 객체를 영속화 시키는 개념이다. 영속성 컨텍스트는 논리적 개념으로 눈에 보이지 않는다. EntityManager를 사용하게 되면 객체 내부에 1:1로 영속성 컨텍스트가 존재하게 된다. 엔티티의 생명주기 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 영속(managed): 영속성 컨텍스트에 관리되는 상태 em.persist(member)하여 영속성 컨텍스트에 객체가 영속 상태로 변환. 준영속(detached): 영속성 컨텍스트에..

Spring Security 필터로 인한 Swagger-ui.html 접속 불가

TroubleShooting 발생한 문제 스웨거 세팅을 했으나 Spring Security 필터로 인하여 스웨거 화면이 뜨지 않는 현상 발견. 해결 및 시도 방법 1. 먼저, h2-console을 확인할 때도 비슷한 경험이 있었기에 HTTP frame option 관련인지 확인. 하지만, h2-console 때문에 이미 설정했으므로 문제 없다고 판단. 2. 다른 리소스들이 들어오지 않아 그림을 못그리는 것인지 확인하기 위해 개발자 콘솔을 확인. localhost:8080/webjars 관련이 못들어오는 것을 확인. 스웨거 리소스가 webjars에만 있을 것 같지 않아 스웨거 리소스에 대한 정보를 얻기 위해 구글링 시작함. 관련 키워드로 구글링 -> `swagger security filter` 스택 오버..

Troubleshooting 2022.08.20

2. JPA 시작하기

JPA 시작하기 데이터베이스 방언 JPA는 특정 데이터베이스에 종속 X MySQL, Oracle 등 각 데이터베이스의 문법에 따르도록 설정하여 사용할 수 있음. JPA가 방언(DB문법이 JPA입장에서)을 해석하여 사용해줌. javax와 hibernate의 차이점 javax는 java 진영 표준으로 jpa에 정의된 패키지이기 때문에 hibernate가 아닌 다른 구현체를 사용하더라도 그대로 사용이 가능하다. 하지만, hibernate.dialect 처럼 hibernate로 시작되는 패키지들은 hibernate에 종속적이므로 hibernate에서만 사용 가능하다. 애플리케이션 개발 JPA 구동 방식 Persistence 클래스에서 META-INF/persistence.XML 설정 정보 파일을 읽음. Enti..

Spring JPA - Cascade 문제 처리

TroubleShooting 발생한 문제 프로젝트에서 Post를 삭제하려고 했으나 Post에 대한 좋아요를 했을 때 DB에 외래키가 저장되어 있어 삭제되지 않는 현상을 문제로 겪었다. 해결 및 시도 방법 1. 양방향 매핑 상태인가? 아니다. 단방향이며 영속성 전이에 대한 속성을 달아줄 수 없다. `cascade = CascadeType.ALL` 옵션을 달아 Cascade 되도록 처리할 수 있디만, 다음과 같은 조건을 만족해야 한다고 한다. 등록 삭제 등 라이프 사이클이 똑같을 때 단일 엔티티에 완전히 종속적일 때 2. 단방향 매핑을 유지하면서 할 수 있는 방법을 찾았다. `@OnDelete(action = OnDeleteAction.CASCADE)` 어노테이션을 달아주자. 하지만, 작동하지 않았다. 관련..

Troubleshooting 2022.08.18

러버덕 디버깅 이야기

오늘 지혜님이 재밌는 것을 찾았다며 개발자의 생각 방법에 관련된 포스트를 보내주시며 러버덕 디버깅이란 것을 알았다고 말씀을 해주셨다. 러버덕 디버깅 In software engineering, rubber duck debugging (or rubberducking) is a method of debugging code by articulating a problem in spoken or written natural language. The name is a reference to a story in the book The Pragmatic Programmer in which a programmer would carry around a rubber duck and debug their code by for..

Web Dev 2022.08.17

Spring CORS 세팅 - addAllowedOriginPattern, isPreFlightRequest 관련 문제

TroubleShooting 발생한 문제 프론트엔드와 백엔드의 협업 과정에서 API 서버를 열기 위해 CORS 필터를 설정해주었으나 몇 가지 잘못된 설정으로 제대로된 통신이 되지 않는 듯 하였다. 해결 및 시도 방법 1. 검색해보니 스프링 부트의 버정에 따른 설정 방법의 차이가 생긴듯 하였다. 스프링 부트 2.4.0 버전 이상부터 "allowCredentials 가 true일 때 allowedOrigins의 값이 "*"이면 안된다"는 에러 문구처럼 설정할 수 없었고 대신 allowOriginPatterns를 사용해야 한다고 한다. 세부사항 변화 Origin 을 OriginPattern 메소드 사용으로 변경 @Configuration public class CorsConfig { // CORS 정책에서 벗..

Troubleshooting 2022.08.17

Controller - 같은 엔드포인트를 파라미터에 따라 나눠쓰기

Controller - 같은 엔드포인트를 파라미터에 따라 나눠쓰기 해결하고 싶었던 상황 위와 같은 조건으로 API를 작성하고 싶었기에 같은 엔드포인트인 `/api/posts`를 쓰지만 파라미터에 따라서 로직 처리를 분리하고 싶었다. 해결 및 시도 방법 1. 처음에는 Controller에서 같은 메소드로 받아 내부에서 genre 값이 null일 경우 Repository 메소드를 findAll로 처리하게끔 로직을 구성하려 했으나 같은 엔드포인트지만 용도가 다르므로 나누는 것이 좋다고 판단했다. 따라서 구글링을 시작했다. public List getPostListByGenre(Post.Genre genre) { // 포스트 장르로 조회. List postResponseDtoList = null; if (gen..

Troubleshooting 2022.08.15

InvalidDefinitionException - jackson 직렬화 문제 + UserDto에 대한 고민

TroubleShooting 발생한 문제 게시글 작성할 때는 Post 안에 들어있는 User를 담아 정상적으로 리턴을 해주었다. 하지만 게시글 조회 기능을 추가하고 조회를 해오니 다음과 같은 익셉션이 터졌다 user가 이니셜라이즈가 되지 않는 것 같았다. 해결 및 시도 방법 해당 익셉션 키워드로 구글링. 1. getOne(Long id) 라는 메소드를 사용하였을때 findById를 사용할 것. 나는 해당되지 않는다. 그런데 getOne 을 사용하면 프록시로 받아와서 사용하는 것 같길래 신기하여 정리하였다. 하지만 이 메소드는 deprecated 되었다. 2. Entity 필드에 `@JsonIgnore` 어노테이션 달기. 이 방법을 선택해도 해결이 된다. 하지만 이 방법을 선택하면 User가 아니라 Use..

Troubleshooting 2022.08.15

Spring Boot - Controller에서 Dto에 Data와 MultipartFile을 매핑하여 함께 받아보기

TroubleShooting 발생한 문제 및 고민한 점. 미니프로젝트에서 게시글 작성을 할 때 이미지와 게시글의 정보들을 함께 받아서 저장하는데 지난주에 이 문제를 해결할 때는 Dto에 매핑을 굳이 하지 않고 다음 사진처럼 그냥 Data와 MultipartFile 을 분리하여 따로 받아서 다시 넣어주도록 해결했다. 하지만, 이러한 점은 기능을 모르는 사람이 보았을 때 각 데이터 간의 연관성을 파악하기도 힘들다는 생각을 했고, Dto에 매핑을 하고 싶어졌다. 해결 및 시도 방법 역시 해결의 시작은 구글링이다. 1. 먼저, Data와 파일 자체 모두를 Base64로 인코딩하여 JSON으로 전달하는 방법을 알게 되었다. 좋은 방법이긴 하나 애초에 고려하지 않았던 이유가 몇가지가 있다. 프론트엔드와 백엔드를 분..

Troubleshooting 2022.08.13

S3 Bucket: MultiObjectDeleteException - IAM 정책 이슈 해결

S3 Bucket: deleteObjects - MultiObjectDeleteException 발생한 문제 프로젝트에서 s3 버킷에 사진을 업로드하는 기능을 작성하고 Spring boot 스케쥴러를 통해 삭제하는 기능을 구현하였다. 삭제가 되는지 기능 테스트를 해보려고 했는데 AccessDenied 되며 403 에러가 떴다. 처음에 이해가 안되었던 부분은 S3 버킷에 대한 권한을 IAM 으로 AmazonS3FullAccess라는 정책을 모두 주었다고 s3 버킷을 만드신 조원분께서 말씀하셨기에 업로드 기능 되고, 고아객체를 판별하여 삭제하기 위해 s3에서 Object List 조회 기능도 되지만 삭제 기능만 안된다는 것이 이해가 안되었다. @Scheduled(cron = "1 * * * * *") // ..

Troubleshooting 2022.08.10