TIL

TIL
오늘은 동적 쿼리랑 정적 쿼리가 뭔지 배웠다 정적 쿼리 정적 쿼리란 검색했을 때 바뀌지 않는 쿼리다 바뀌지 않는 쿼리...? 검색값이 바뀌지 않는 쿼리라고 생각하면 된다. 만약 ORDERS라는 테이블에 가격 컬럼과 주문번호 컬럼이 있다고 가정하고 1번 주문 5000원 2번 주문 8000원 3번 주문 10000원 이라고 가정하면 SELECT * FROM ORDERS -> order_id price 1 5000 2 8000 3 10000 이런 식으로 안에 들어 있는 값에 따라 딱 정해져서 나온다 쿼리의 구조가 항상 동일 하다. 즉 구조가 변경되지 않는다 동적 쿼리 동적 쿼리란 어떤 인자에 의해서 쿼리의 결과가 바뀔 수 있는 쿼리다 만약에 가격이 8000원 이하인 주문만 출력하고 싶다 하면 SELECT * F..
TIL
AOP란? AOP(Aspect Oriented Programming) 관점 중심 설계다. 예를 들어 '부가기능'과 '핵심기능' 과는 관점(Aspcet)이 다르다. 따라서 핵심기능과 부가기능을 분리해서 부가기능 중심으로 설계가 가능하게 하는 것이 AOP다 AOP를 사용해서 부가기능을 모듈화 할 수 있다. 모듈화 - 유지보수성을 높이기 위해 코드를 여러개의 모듈로 나누는 것 @Aspect Spring Bean 클래스에만 적용 가능 클래스를 AOP화 하게 해주는 어노테이션 어드바이스 종류 @Around: '핵심기능' 수행 전과 후 (@Begore + @After) @Before: '핵심기능' 호출 전 @After: '핵심기능' 수행 성공/실패 여부와 상관없이 언제나 동작 @AfterReturning: '핵심기..
TIL
오늘은 기존 개인 투 두 프로젝트에서 Service를 인터페이스화 시키고 Service 구현체를 만드는 리팩토링을 진행하였다. public interface CardService { // ... } @Service public class CardServiceImpl implements CardService { // ... } 의문점 굳이 인터페이스를 써야하나? 라는 의문점을 가진 것은 아니다. Spring에서 의존성 관리를 위해서 @Service 어노테이션을 갖고있는 클래스의 Bean을 빈팩토리에 넣어서 가지고 있는데, 내가 CardService인터페이스를 Controller에서 주입을 받는다고 하면 Spring 은 자동으로 인터페이스의 구현체 Bean을 찾아서 주입을 해준다. 여기서 들었던 의문이다. ..
TIL
이번 배달 어플 API 팀 프로젝트를 하면서 고민했던게 가게나 메뉴, 주문등이 삭제되면 고아객체를 어떻게 관리할 것인가? 였다. 강의에서 Cascade와 OrphanRemoval를 배워서 고아객체에 대한 개념을 알기 때문에 이 부분에 대해서 논의를 해봤다. 논의 실제 서비스를 한다고 가정했을때, 메뉴가 삭제되거나, 가게가 삭제된다고 해서 주문과 리뷰등이 사라진다면 어떤 문제가 일어날까? 사업자가 정산을 받거나, 추후에 세금 계산 할 때 누락이 되는 등 갖가지 문제가 일어날 수 있다. 이런 문제를 어떻게 해결할까? 간단한 해결법 엔티티에 Boolean 타입으로 isDeleted 필드를 추가해주었다. 이렇게 하면 위에서 논의한 문제들을 간단하게 해결할 수 있다 조회를 할 때도 isDeleted true만 제..
TIL
문제 정의사실 수집유저 회원가입 테스트 중 getWriter() has already been called for this response 출력 ExceptionHandeler에서 문제가 났다고 하길래, Exception을 안 내면 되겠다고 생각했다. Exception을 안 내도 getWriter() has already 오류가 발생했다 원인 추론response를 반환해야하는데, 이미 getWriter() 가 쓰였기 때문에 안 된다는 의미 같았다. @RequiredArgsConstructor public class JwtAuthorizationFilter extends OncePerRequestFilter { private final JwtUtil jwtUtil; private final ObjectMa..
TIL
Access Token Access Token이 탈취를 당하면 큰 일이 난다. 그래서 이걸 방지하려고 AccessToken의 만료기한을 짧게 설정하는데, 이러면 사용자 경험이 나빠지게 된다. 계속 로그인을 해야하니까! 그래서 이 해결법으로 나온 게 Refresh Token이다 Refresh Token Refresh Token은 Access Token 이 만료 됐을 때 Access Token 을 재발급 해주기 위해서 사용한다 프로세스 기본적인 개념은 아래와 같다 Access Token 만료기한이 짧다 Refresh Token 만료기한이 길다 평소 API 통신에서는 Access Token을 사용하고, Refresh Token은 Access Token이 만료되어 갱신 될 때 사용한다. Refresh Token..
TIL
오늘 팀 프로젝트간에 일어났던 문제다 jwt와 security를 정확히 잘 파악하지 못해서 팀 프로젝트에서 내가 인증 인가, 및 유저 도메인을 맡기로했다 그런데 역시나 문제가 발생했다 로그인을 하는데 unsuccessfulAuthentication로 계속 빠지는 것이다. 그래서 디버깅을 해봤는데 AccountStatus??? 분명 이런 걸 관리하는 곳이 있었는데 @Getter @RequiredArgsConstructor public class UserDetailsImpl implements UserDetails { private final User user; @Override public Collection
TIL
@DataJpaTest @DisplayName("User Entity JPA 테스트") class UserTest { @Autowired private TestEntityManager entityManager; PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); @Test @DisplayName("유저 저장 시 아이디, 비밀번호, role이 일치해야 한다 / 비밀번호는 Encode 해서 저장") void 유저_저장_성공() { // Given String username = "username"; String rawPassword = "password"; String encodedPassword = passwordEncoder.encode(raw..
TIL
@Test @DisplayName("댓글 수정 테스트") void 댓글_수정_테스트() throws Exception { //given mockUserSetup(); String content = "수정댓글"; Long commentId = 1L; CommentRequestDto requestDto = new CommentRequestDto(); requestDto.setContent(content); String requestJson = objectMapper.writeValueAsString(requestDto); CommentResponseDto responseDto = new CommentResponseDto(); responseDto.setAuthor("username"); responseDto..
wonow_
'TIL' 카테고리의 글 목록 (8 Page)