BackEnd262 [Jenkins] Jenkins에서 TestCotnainer가 동작하지 않는 문제 ("Could not find a valid Docker environment") 이번에 Jenkins Pipeline을 구축하여 CI 과정을 수행하던 도중, gradle test가 정상적으로 수행되지 않는 문제를 경험하였다. 1. 문제 상황 우선 다음 출력된 로그를 살펴보면 다음과 같다.contextLoads() 부터 FAILED인것으로 미루어 보았을 때 contextLoads() 부터 FAILED인것으로 미루어 보았을 때 든 생각은 2가지 였다. 1) DB와 connection이 정상적으로 연결되지 않았다. 2) TestContainer가 정상적으로 생성되지 않고있다. 처음에는 1번 문제인줄 알고 계속 properties.yml을 수정하고, 설정을 변경함으로써 해결하려 했지만... 2일동안 삽질만 하고 있었던것 같다. 다시 test를 수행하면서 log를 debug로 수행하였더니 다.. BackEnd/Jenkins 2022. 12. 14. SpringBoot에 Test Container적용 (MySQL, Redis) 도커와 테스트 (TestContainers) 테스트를 위해서는 운영과 동일한 형태의 개발 환경에서 테스트 하는 것이 중요하다. 하지만 매번 동일하게 환경을 구축할 수 없고 모든 개발 자들과 같은 환경을 맞추기도 쉽지 않다. 이를 Test Container를 통해 해결해 보자! (단점 테스트 수행 속도가 느려짐 → 다행이 이는 컨테이너를 한번만 인스턴스화 하는 방식으로 해결가능) (중요) Docker는 켜져 있어야 합니다!!! Docker Container를 활용한 일회용 인스턴스를 제공하는 JUnit 테스트 라이브러리를 말합니다. JUnit 5 Quickstart JUnit 5 Quickstart - Testcontainers for Java JUnit 5 Quickstart It's easy to ad.. BackEnd/TDD 2022. 12. 13. [JPA] QueryDsl에서 Groupy By적용 후 가장 큰 원소 가져오기 우선 이번 글은 제가 쿼리를 잘 못짠 부분도 있기 때문에, 다른 방식도 있을 수 있습니다. 다만 구글에 검색시 별다른 방법이 보이지 않아 글을 작성해 봅니다. 1. 문제가 된 상황 프로젝트를 진행하다 보니 다음과 같은 상황이 있었습니다. User와 Post는 중간테이블인 Scrap을 두고 N:M 관계를 형성하고 있습니다. Post와 PostPhoto는 1: N의 관계로, 하나의 Post당 여러 PostPhoto가 있는 상황이였습니다. 자 여기서 의문점! 1) 사용자가 다음과 같이 원하는 피드에서 저장하기(스크랩) 버튼을 누른다. 2) scrap 엔티티로 저장된다. 3) 이후 다음과 같이 프로필 페이지에서 "관심목록"을 누를경우, 스크랩된 하나의 피드당 하나의 대표 사진만 보여줘야 한다. 이를 어떻게 Qu.. BackEnd/JPA 2022. 11. 23. [Java] static inner class 는 언제 로드, 초기화가 될까? 최근 코코아 과정 수업도중에 질문받은 내용중 인상깊었던 질문을 조금더 정리해볼까 한다. 학생분이 질문했을때 나 또한 순간 static 키워드에 생각이 쏠려서 "왜? 맨처음 초기화가 안된거지?"라는 생각에 빠졌는데... 가장 큰 키워드를 생각 안하고있었다... "Inner Class"라는 점.... 이점만 다시 상기하면 다행이 나의 설명이 틀리지는 않았었다! (진짜 사람이 순간 당황하니까 진짜 내가 알고있던 지식이 왜곡 되는 느낌이였다.... ) 우선 문제가된 singleton 코드를 잠시 살펴본후, 이에 대하여 알아보자! 1. LazyHolder 방식의 singleton public class OuterSingleton { private OuterSingleton() { } public static Ou.. BackEnd/Java 2022. 11. 16. [JPA] QueryDSL 에서 Select필드로 상속한 Entity 사용시 경험한 문제 프로젝트를 진행하다 보니, ID값을 공통적인 BaseEntity에 들고 있어서 발생하는 문제가 있었습니다. 2가지 문제였는데 1) no property found for class with parameters 2) com.querydsl.core.types.QBean com.example.queyrdsl.entity.BarMoodTag with modifiers "protected" 이를 해결해보자! 1. 문제 상황 우선 PostId를 하나 받으면, 해당 포스트에 연관된 모든 MoodTag를 가져오는 것 이 목표인 상황입니다! ▶ BaseEntity @MappedSuperclass @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public abs.. BackEnd/JPA 2022. 11. 10. [JPA] Soft Delete 자동 처리하기 이번 프로젝트를 진행하면서 1급 컬랙션을 통한 Soft Delete를 처리하면서 기록을 남겨본다! 1. Soft Delete 란? 우선 데이터를 삭제하는 방식에는 hard delete, soft delete 2가지 있습니다. hard delete는 delete 쿼리를 날려서 데이터베이스에서 실제로 삭제하는 방식이고, soft delete는 실제로 데이터베이스에서 데이터를 삭제하는 것이 아니라, 테이블에 deleted와 같은 필드를 추가해주고, update 쿼리를 통해서 deleted 값을 변경해주는 방식입니다. soft delete를 한 경우, 조회시 sofe delete 처리된 값이 함께 반환되면 안되기 때문에 "where deleted = false"같은 조건을 추가하여 sofe delete되지 않은.. BackEnd/JPA 2022. 11. 9. [Spring Security] 웹 기반 인가처리 과정 본 글은 Spring Security docs 와 여러 블로그 들을 참고하고, 공부하면서 요약하였습니다. 1. 인가처리 - 주요 아키텍처 이해 1 - 1) Spring Security의 인가처리 예를 들어 다음과 같이 권한 설정을 했다고 해보자! http.antmatchers("/user").access("hasRole('USER')") 사용자(인증정보)가 "/user"자원(요청정보)에 접근하기 위해서는 "ROLE_USER" 권한(권한정보)이 필요한 상황이다. 이제 사용자 요청이 들어왔을때 어던 방식으로 초기화 되는지 알아보자! 1) 인증정보(Authentication)는 SecurityContext에서 얻습니다. 2) 사용자 요청정보로부터 FilterInvocation클래스를 생성해서 request 정.. BackEnd/Spring Security 2022. 11. 1. [Spring] @Configuration 이란? 이번 글에서는 @Configuration을 사용하는 이점에 대하여 정리해볼까 한다. 1. @Configuration 이란? " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 Spring에서 Bean을 수동으로 등록하기 위해서는, 설정 class위에 @Configuration을 추가하고, @Bean을 사용해 수동으로 빈을 등록할 수 있다. 이때 메서드 이름으로 빈의 이름이 결정된다. 그러므로 중복된 빈 이름이 존재하지 않도록 주의해야 한다. 예를 들면 다음과 같을 것이다. @Configuration public class SomeConfig { @Bean public ShineResource shine() { return new ShineResource(); } } 일반적으로.. BackEnd/Spring 2022. 9. 12. [JPA] Open Session In View 더 깊게 사실 예전에 이미 OSIV에 대한 글을 작성한 적이 있다. https://blogshine.tistory.com/379 HTML 삽입 미리보기할 수 없" data-og-host="blogshine.tistory.com" data-og-source-url="https://blogshine.tistory.com/379" data-og-url="https://blogshine.tistory.com/379" data-og-image="https://scrap.kakaocdn.net/dn/lMCFs/hyPLg4W1Gs/Muf3gnc1ikTWyz5K0u0qDk/img.png?width=622&height=526&face=0_0_622_526,https://scrap.kakaocdn.net/dn/gux9D/hyPJW.. BackEnd/JPA 2022. 9. 11. [JPA] Lazy 로딩으로 인한 JSON 반환 오류 (No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer) 1. 문제의 상황 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 Issue 와 Comment 는 1:N의 관계이다. 따라서 Comment의 코드를 보면 다음과 같이 Lazy 로딩이 걸려있다. ▶ Comment @Getter @Entity @EqualsAndHashCode(of = "id") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Comment extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "comment_id") private Long id; @ManyToOne(fetch .. BackEnd/JPA 2022. 9. 7. [Java] 동일성(identity)과 동등성(equality) 팀원들과 면접 스터디를 진행중인데, 한번쯤 정리하면 좋은 내용이라 생각되어 정리해본다. 1. 동일성(identity) 우선 다음 그림을 살펴보자. 변수 1은 객체1을 가리키고 있고, 변수2 와 변수3은 객체2를 가리키고 있다. 즉, 변수2 와 변수3은 동일한 객체를 가리키고 있으므로, 두 변수는 동일하다고 이야기할 수 있다. 그리고 해당 변수가 동일한지 == 연산자를 통해 판별할 수 있다. 참고로 Primitive 타입은 주소가 없으므로 == 연산자를 사용하였을 때 내용이 같으면 동일하다고 판단한다. 2. 동등성 (equality) 두 개의 객체가 같은 정보를 갖고 있는 경우 동등하다고 판단한다. 즉, 참조하고 있는 객체의 주소가 서로 다르더라도 내용만 같으면 두 변수는 동등하다고 말할 수 있다. Jav.. BackEnd/Java 2022. 9. 6. [Spring Security] AccessDecisionManager, AccessDecisionVoter 본 글은 Spring Security docs 와 여러 블로그 들을 참고하고, 공부하면서 요약하였습니다. 1. AccessDecisionManager, AccessDecisionVoter " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 1-1) AccessDecisionManager AccessDecisionManager는 인터페이스 이다. 인증, 요청, 권한 정보를 이용해서 사용자의 자원접근을 허용 or 거부 여부를 최종 결정하는 주체이다. 여러 개의 Voter들을 가질 수 있고, Voter들로부터 접근허용,거부,보류에 해당하는 각각의 값을 리턴받아 판단&결정한다. 최종 접근 거부시 예외 발생 ▶ AccessDecisionManager의 3가지 구현체 1. Affirma.. BackEnd/Spring Security 2022. 9. 4. 이전 1 2 3 4 5 6 7 ··· 22 다음