목록Java/Spring (32)
오답노트
리팩터링 계기과제 전형을 진행하면서 나름 재밌었기 때문에 이 프로젝트에서 아쉬웠던 부분을 발전, 보완하고 싶다는 생각이 들었다. (결과는 탈락) 과제 전형 제출 후 여러 일정이 겹쳐서 바로 코드를 들여다 보지는 못했지만, 평소 생각하던 부분을 바꿔보고 싶다고 생각했고, 그 중 하나는 오늘 이야기 하려는 Controller에서 요청에 대한 Parameter 유효성 검증이다. 검증 로직 개선우선 가장 최근의 Controller의 유효성 검증 로직을 살펴보자 @PostMapping()public ResponseEntity saveAlarm(@RequestBody AlarmRequestDto alarmRequestDto) { AlarmResultResponseDto alarmResultResponseDto..
소스코드import org.junit.jupiter.api.Test;import org.junit.jupiter.api.extension.ExtendWith;import org.mockito.InjectMocks;import org.mockito.junit.jupiter.MockitoExtension;@ExtendWith(MockitoExtension.class)public class NaverSearchServiceImplTest { @InjectMocks private NaverSearchServiceImpl naverSearchService; @Test void testHarmornyroomSearch() { naverSearchService.getHarmornyR..

Maven 의존성 추가 ... org.apache.tomcat.embed tomcat-embed-jasper application.properties 설정 추가spring.mvc.view.prefix=/WEB-INF/views/spring.mvc.view.suffix=.jsp 경로 추가결과 확인

@Controller일반적인 API를 만드는 것 가능Model을 인자로 주게 되면 View를 호출 할 수 있음@ResponseBody를 활용하면 REST 방식으로 응답 가능@RestControllerRest API를 만드는 것에 용이하다.인터페이스를 보면 @Controller와 @ResponseBody를 사용하고있다.Model를 인자로 줘도 View를 호출 하지 못함package org.springframework.web.bind.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation..
OAuth2 다량의 사용자를 보유하고 있는 벤더에게서 사용자 정보를 위임을 받아 사용자를 가입하게 하는 방식이다. 개발 환경 구축 dependencies { implementation("$boot:spring-boot-starter-oauth2-client") } build.gradle에 위와 같은 의존성을 추가한다. spring: security: oauth2: client: registration: google: client-id: 532557492921-oanhrsrege0kqvb7q1v0v2o4lcu0ktlc.apps.googleusercontent.com client-secret: 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 application.yml 에 위와 같이 설정한다..
세션 관리 서버는 모든 요청에 아이디/패스워드를 요구 할 수 없다. 그래서 한 번 로그인 하면 토큰을 발급하고, 세션에는 토큰을 저장해 세션이 유지되는 동안, 혹은 remember-me 토큰이 있다면 해당 토큰이 살아있는 동안 해당 토큰만으로 사용자를 인증하고 요청을 처리한다. SessionManagementFilter SessionRegistry를 Bean으로 등록하여 SessionInformation(세션 사용자)를 모니터링 할 수 있다. 만료된 세션에 대한 요청은 세션 즉시 종료하고, 만료 판단은 SessionManagementFilter 의 ConcurrentSessionControlAuthenticationStrategy 에서 처리한다. @Bean SessionRegistry sessionReg..
영속성 전이 (Cascade) 영속성 전이는 포함하고 있는 속성에 대해 현재 속성이 받는 영향을 전달하는 것이다. 예를 들어 Book 과 Publisher 가 1:N 관계를 가지고 있고, Book을 제거 하면 Publisher도 같이 제거 해야하는데, 그렇게 하려면 쿼리를 두 번 날려야한다.(각각 삭제에 대한 쿼리) 하지만 영속성 전이를 통해 Book이 삭제 될 때, Publisher와 연결되는 Book이 삭제된다면 해당 Publisher도 삭제한다. @Entity @NoArgsConstructor @Data @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) @DynamicUpdate public class Book extends Base..
1:1 관계 Book 과 BookReviewInfo 의 1:1 관계를 나타내는 예시이다. 연결할 두 Entity에 상대방 멤버 변수를 만들고 OneToOne Annotation을 달아주면 연결된다. OneToOne Annotation에 mappedBy를 설정하게 되면 ToString이 순환 참조로 인해 에러가 발생한다. 둘 다 사용하고 싶다면 한쪽에는 @ToString.Exclude를 사용하자. OneToOne @Entity @NoArgsConstructor @Data @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) public class Book extends BaseEntity { @Id @GeneratedValue(strategy ..
Query Method JPA에서 쿼리문을 직접 작성하지 않고 Method명으로 지정만 하면 자동으로 쿼리를 만들고 요청까지 해주는 편리한 기능이 있다. https://www.javaguides.net/2018/11/spring-data-jpa-query-creation-from-method-names.html Spring Data JPA - Query Creation from Method Names In this article, we will learn how we can create query methods by using the query generation from the method name strategy. Spring Data JPA offers various ways to create a ..
Listener JPA에는 Listener가 있는데, curd를 할 때, Anotation을 활용해 전후로 원하는 로직을 만들어 넣을 수 있다. https://www.baeldung.com/jpa-entity-lifecycle-events#lifecycle Auditing Listener를 통해서 자주 사용하는 기능을 Spring에서 Anotation으로 미리 만들어 놨다. (ex. CreatedDate) 이를 사용하기 위해서 AuditingEntityListener를 상속 받으면 된다. @Data @MappedSuperclass @EntityListeners(value = AuditingEntityListener.class) public class BaseEntity { @CreatedDate priv..