전체 글
Java 8 Interface - default 메서드, static 메서드
Java 8 이후로 interface에 대한 정의가 몇가지 변경되었다. 상황 이미 만들어져 있는 Interface 에 기능을 추가 하고 싶다. 하지만 이 Interface를 implemnets 받고 있는 class 모두가 이 기능의 구현체를 생성해야만 한다. default 메서드 인터페이스가 default 키워드로 선언되면 메서드를 구현할 수 있게 된다. -> 구현체들은 오버라이딩이 가능하다. package com.example.demo; public interface UserService { String getName(Long userId); int getAge(Long userId); /** * @implSpec 이 구현체는 주소를 반환한다. * @param userId * @return */ // ..
[MapStruct] 내가 찾아 쓰려고 정리한 글
🏃♂️ 계속해서 업데이트 하기 🏃♂️ 1. 공식문서 2. 왜 사용할까? 3. 동작방식 4. 의존성 5. Mapper Inteface 작성 6. Mapper 구현체 살펴보기 공식문서 https://mapstruct.org/documentation/stable/reference/pdf/mapstruct-reference-guide.pdf MapStruct 왜 사용할까? 보통 DB에서 데이터를 조회하고 서비스단에서 로직을 설계 하기 위해 Entity -> Dto , Dto -> Entity 작업을 하게 되는데 이러한 Mapping 작업을 해주는 라이브러리가 많이 존재한다 그중 아래의 링크를 확인해보면 MapStruct 퍼포먼스가 빠른 것을 확인할 수 있다. https://www.baeldung.com/j..
[Querydsl] 내가 찾아 쓰려고 정리한 글
🏃♂️ 계속해서 업데이트 하기 🏃♂️ 마지막 업데이트 2022/03/29 1. Querydsl 을 왜 사용할까? 2. 작동방식? 3. 의존성 4. Repository 구조 5. Projection 의 대한 고찰 ... 6. 동적쿼리 (BooleanBuilder) 7. ExpressionUtils 8. 정렬 타입에 따른 정렬 처리 Querydsl 을 왜 사용할까? JPA 를 사용하면서 (@Query 포함) 조회 기능에 대한 한계가 있다. 동적인 쿼리인 경우인데 예를 들어 주문 페이지를 검색 한다고 했을 때 카테고리 or 상품명 or 기업명 등등... 으로 검색 조건이 달라지는 부분이다. 그래서 사용하게 된 것이 바로 Querydsl 프레임워크 이다. - 타입 체크가 바로 가능하다 - 자바 코드를 기반으..
[Lombok] Difference Between @Value and @Data
컴파일과정에서 생성해 주는 방식으로 동작하는 java라이브러리입니다. @Value 기본적으로 불변객체로 만들어준다. class에 선언하면 아래의 어노테이션이 기본적으로 포함된다. @Getter @AllArgsConstructor @ToString @EqualsAndHashCode @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) 하지만 @Setter 는 포함되지 않는다. 왜냐하면 기본적으로 불변성을 보장하기 때문에 setter를 생략하는 것은 당연하다 @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) 는 private이나 final 을 사용할 수 있게 해준다. 최종적으로 @Value ..
HTTP , HTTPS
HTTP / HTTPS - HTTP : 서로 다른 시스템들 사이에서 통신을 주고받게 하는 가장 기본적인 프로토콜(서버에서 브라우저로 데이터를 전송하는 용도로 가장 많이 사용함) 문제점 - 서버에서 브라우저로 전송되는 정보가 암호화되지 않는다. - HTTPS : SSL(보안 소켓 계층) 사용, 서버와 브라우저 사이에 안전하게 암호화된 연결을 만들 수 있게 도와준다. 서버와 브라우저가 민감한 정보를 주고받을 때 해당 정보가 도난당하는 것을 막아줌. HTTP 자체를 암호화하는 것이 아닌 HTTP Message Body를 암호화한다. (즉, Header는 암호화되지 않는다) HTTPS 사용해야하는 이유 1. 중간에 데이터를 가로채도 암호화되어 있기 때문에 안전하다. 2. 구글은 HTTPS 웹 사이트에 가산점을 ..
8. Service
@RequiredArgsConstructor @Service public class DiaryRegisterService { private final CoupleRepository coupleRepository; private final DiaryRepository diaryRepository; private final UserRepository userRepository; public DiaryRegisterResponse addDiary(DiaryRegisterRequest diaryRegisterRequest) { Couple couple = coupleRepository .findByCoupleToken(diaryRegisterRequest.getCoupleToken()) .orElseThrow(..
7. CI/CD 계획
리팩토링이 30%정도 남은 시점에서 자동화 배포를 계획하고자합니다! 우선 처음해봐서 검색으로 찾아낸 방법을 실행한 후 방식을 이해하고 다른걸로 바꿔볼 예정입니다. 제일 많이 들어봤던 Jenkins, Docker를 사용할 예정입니다. 1. GitHub Push. 2. GitHub에서 Jenkins에 Build 유발한다. 3. Jenkins에서 Gradle Build하여 Jar 파일 생성 한다. 4. 생선된 Jar 파일을 build 한다. 5. DocerHub에 Push 한다. 6. Jenkins 가 DockerHub에 있는 파일을 pull 한다. 7. 이전 컨테이너 삭제 후 새로 받아온 이미지를 실행한다. https://velog.io/@haeny01/AWS-Jenkins%EB%A5%BC-%ED%99%9..
6. 무엇이 문제일까 ...
Test 도중 이상하게 ResponseFileds를 받지 못하는 문제가 있다. 혹시나 해서 postman으로 테스트 해보았는데 아래와 같이 잘나온다 ... 테스트는 성공하지만 responseFields 가 없다며 계속해서 오류를 뱉는다 ... ㅜㅜ 무엇이 문제일까 @Test void loginUser() throws Exception { final UserLoginRequest userLoginRequest = UserLoginRequest.builder().socialToken("Asd823daz").pushToken("Wesdf0898dfa").build(); final UserLoginResponse userLoginResponse = UserLoginResponse.builder().coupleT..
5. Spring REST Docs 사용
서비스 구현에 앞서 REST API 문서를 자동화 해주는 Spring REST Docs 를 사용해본다. Docs를 사용한 이유는 Test에서 성공해야만 문서를 만들 수 있기 때문에 사용하게되었습니다. 강제로 TEST CODE를 작성하여 API에 대한 신뢰성을 높일 수 있기 때문입니다. Gradle 7을 사용하고 있었는데 문서생성이 안되서 검색해봤다. 우회방법이 있지만 복잡하기 때문에 다운그레이드를 선택했다. 그리고 Gradle과 Maven 에서 다르게 설정되는 부분이 있기 때문에 맨아래 링크를 통해 확인해보는 것도 좋다! 환경설정 Springboot 2.6.1 Gradle 6.9.1 JUnit5 Asciidoctor 1.5.9.2 build.gradle 에 추가한 설정 plugins { id "org.a..
4. 연관관계 - OneToMany
DiaryEntity package so.ego.re_darling.domains.diary; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import so.ego.re_darling.domains.user.domain.Couple; import javax.persistence.*; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; @Gette..
3. 연관관계 - ManyToOne
Coupon Entity package so.ego.re_darling.domains.coupon.domain; import lombok.*; import so.ego.re_darling.domains.user.domain.User; import javax.persistence.*; import java.time.LocalDateTime; @AllArgsConstructor(access = AccessLevel.PROTECTED) @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "coupon") @Entity public class Coupon { @Id @GeneratedValue(strategy = GenerationType.IDEN..
2. Entity
package so.ego.re_darling.domains.coupon.domain; import lombok.*; import javax.persistence.*; import java.time.LocalDateTime; @AllArgsConstructor(access = AccessLevel.PROTECTED) @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "coupon") @Entity public class Coupon { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NonNull private String title; private Str..