inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

AOP/필터/인터셉터 질문

미해결

스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션

안녕하세요 강사님. 본 강의에서 BindingResult를 처리하기 위해 아래와 같이 AOP를 적용하셨습니다. 제가 궁금한 점은 다음과 같습니다. 위의 AOP 적용을 위한 validationAdvice는 구체적으로 언제 (joinPoint 전 or 후 ?) 실행되는지 궁금합니다. joinPoint의 전후제어라고 설명해주셨는데, joinPoint의 전에 실행되는 것인지 후에 실행되는 것인지가 궁금합니다. 예를 들어, 사용자가 컨트롤러 Post or Put 요청 시 유효성 검사를 통과하지 못한 에러가 bindingResult에 담깁니다. 그리고 위의 AOP validationAdvice 코드 내부는 이미 BindingResult에 에러가 담긴 이후의 코드를 실행하도록 되어있습니다. 이때의 로직 흐름은 다음과 같은 실행 순서로 보면 될까요? 만약 맞다면, joinPoint의 후에 실행되는 것으로 보면 될까요? "컨트롤러 진입 및 실행할 Post or Put 메서드 탐색 -> 해당 api 메서드 호출을 위해 http body의 데이터들을 ReqDto 객체로 변환 -> 유효성 검사 실패로 인한 bindingResult에 담김 -> 해당 api 호출 실패 -> 해당 api 호출이 실패로 끝났으므로 이후 AOP validationAdvice 호출 (joinPoint 후처리) -> Exception 발생 위와 같이 BindingResult 처리를 AOP 대신 필터나 인터셉터를 적용하여서는 해결할 수 없을까요 ?? 필터와 인터셉터는 여러 차이가 있지만 대표적으로 호출 순서에 차이가 있다고 알고 있습니다. 디스패처 서블릿 이전에 필터가 실행되며, 디스패처 서블릿 이후에 인터셉터가 실행되는 것으로 알고 있습니다. 위에 작성한 코드처럼 AOP 적용 위치는 개발자가 지정할 수 있는 것으로 보여집니다. 실제 컨트롤러가 호출되기 전에 필터나 인터셉터 호출되므로 BindingResult 검사를 할 수 없어서 AOP로 적용하신 것인지 궁금합니다. 만약 해결할 수 있다면, AOP로 적용한 이유가 궁금합니다. 추가적으로, Jwt Filter에서 필터를 이용하여 구현하셨습니다. UsernamePasswordAuthenticationFilter와 같이 이미 제공해주는 시큐리티가 있어서 그것을 활용하여 보다 편리하게 구현할 수 있는 것 같습니다. 그러나, 필터 대신 AOP나 인터셉터로도 Jwt 서버를 구현하는 것이 가능한지 궁금합니다. 좋은 강의를 듣다보니 자연스레 질문이 많아지는 것 같습니다. 정말 많이 배우고 있습니다. 감사합니다 !

  • spring-boot
  • junit
yoongdoo0819 댓글 1 좋아요 0 조회수 332

saveAccount_test (JWT 검증 및 시큐리티 세션 생성) 질문

해결됨

스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션

안녕하세요, 강사님. "계좌등록 컨트롤러 테스트" 강의에서 AccountController Test 코드 작성 시, 아래와 같이 saveAccount_test()에 궁금한 점이 있습니다. 위의 테스트 코드에서 @WithUserDetails(value = "ssar", setupBefore = TestExecutionEvent.TEST_EXECUTION) 어노테이션을 선언해줘야 하는 이유를 설명해주셨습니다. 그리고 request가 JWT 토큰이 없다고 하더라도 아래의 doFilterInternal 메서드를 실행하며 if문을 통과하지 못하더라도 chain.doFilter를 통해, 결국 컨트롤러단까지 간다고 말씀해주셨습니다. 위의 doFilterInternal 메서드 작성 시, if - else 문으로 작성하지 않은 이유가 테스트를 수월하게 할 수 있기 때문이라고 말씀해주셨습니다. 제가 궁금한 점은, 실무에서도 위의 코드처럼 JWT 토큰이 없는 request를 바로 차단하지 않고 컨트롤러단까지 흘려보내는지 여부가 궁금합니다. 제가 아직 시큐리티 측면을 잘 모르기 때문에 하는 질문이라고 생각해주시면 감사하겠습니다. 실제 배포/운영 환경에서는 테스트 코드를 편리하게 짜는 것보다 보안이 더 중요한 요소라고 생각되기에, JWT 토큰이 없는 request를 바로 차단할 수 있다면 즉시 차단하고 컨트롤러단까지 흘려보내지 않는 것이 더 안전하지 않을까 하는 생각이 들었습니다. 감사합니다.

  • spring-boot
  • junit
yoongdoo0819 댓글 1 좋아요 0 조회수 463

연관관계 메서드의 위치는 핵심적으로 컨트롤 하는 쪽이 무슨 말일까요?

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

24분 30초부터 연관관계 메서드에 관련해서 설명해주시는데 연관관계 메서드의 위치는 핵심적으로 컨트롤 하는 쪽에 있는 것이 좋다 이게 무슨 말인지 잘 이해가 되지 않습니다 ㅠㅠ

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
댓글 1 좋아요 0 조회수 362

graphviz 설치 후 에러메시지..문의드립니다.

미해결

[개정판] 파이썬 머신러닝 완벽 가이드

graphviz 설치하고 실습파일 4-2의 3번째줄까지 코드를 작성하면 '[Errno 13] Permission denied: PosixPath('dot')' 가 발생합니다. 해결방법을 알 수 있을까요?

  • python
  • 머신러닝
  • 통계
sitedelarue 댓글 2 좋아요 0 조회수 492

updateItem질문입니다.

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

@PostMapping("/items/{id}/edit") public String updateItem(@PathVariable Long id, @ModelAttribute Item item) { Item findItem = itemService.findById(item.getId()); //더티 체킹 findItem.setId(item.getId()); findItem.setName(item.getName()); findItem.setPrice(item.getPrice()); findItem.setStockQuantity(item.getStockQuantity()); findItem.setAuthor(item.getAuthor()); findItem.setIsbn(item.getIsbn()); return "redirect:/items"; } 강의를 보지 않고 스스로 코드를 짜보고 있는데 이렇게 하니까 수정내역이 반영 되지 않더라구요 스스로 생각해봤을 때는 다음 2가지 이유 중 하나일 것 같은데 이유가 이유가 무엇인가요 ㅠㅠ? findItem은 영속성 컨텍스트가 관리하지 않는 객체가 된 것이다. 따라서 더티체킹이 되지 않는다. 영속성 컨텍스트가 관리하는 엔티티는 맞지만 Controller에는 트랜잭션이 없어서 반영이 안되는 것이다.

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
댓글 1 좋아요 0 조회수 658

정규표현식 실습

해결됨

스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션

안녕하세요 강사님. 정규표현식 실습 강의에서 궁금한 점이 있습니다. 한글만 가능하도록 정규표현식을 작성하는 것을 " ^[가-힣]+$" 라고 말씀해주셨습니다. 궁금한 점은 "[가-힣]+" 라고 작성하면 한글 외의 글자가 들어와도 true라고 반환하는 케이스가 어느 경우인지 입니다. "[가-힣]+" 라고 작성해도 띄어쓰기와 ""일때도 모두 false를 반환합니다. 즉, " ^[가-힣]+$" 대신에 "[가-힣]+" 라고 할 경우 어떠한 케이스들을 걸러내지 못하는지 궁금합니다. 감사합니다.

  • spring-boot
  • junit
yoongdoo0819 댓글 1 좋아요 0 조회수 456

파이썬 주파수 추출

미해결

파이썬을 통해 음성 wave파일에서 주파수 값을 추출해서 array 등으로 계산할 수 있도록 하려고 합니다. 그렇게 해서 주파수 대역폭 (최대 - 최소)를 값으로 구하고 싶은데 아무리 구글링을 해도 안나오네요 ㅜㅜ 뭘써야할까요..>?

  • 파이썬
  • 주파수
  • 통신
  • python
한정이 댓글 1 좋아요 0 조회수 1192

@Param의 존재 이유>?

미해결

실전! 스프링 데이터 JPA

@EntityGraph(attributePaths = "team") List<Member> findEntityGraphByUsername(@Param("username")String username); 이번 강의를 복습하다 보니까 강사님께서 @Param을 사용하셨더라구요.(강의 20:59) findByAge(), findOptionalByUsername()과 같은 메소드는 @Param 애노테이션 없이도 잘 동작 했는데 따로 특별한 이유가 있는 것일까요?

  • java
  • spring
  • spring-boot
  • jpa
댓글 1 좋아요 1 조회수 536

fetchResult() deprecated

미해결

실전! Querydsl

됐던데 앞으로는 강의의 searchPageComplex와 같은 방법 (content따로, total따로)으로만 구현하고 사용하면 되는 건가요 ? searchPageSimple 부분은 필요가 없는 건가요?

  • java
  • jpa
댓글 1 좋아요 0 조회수 1370

tuple자료구조가 어떻게 되어 있는 건가요 ?

미해결

실전! Querydsl

@Test public void tupleProjection() throws Exception { List<Tuple> result = queryFactory .select(member.username, member.age) .from(member) .fetch(); System.out.println("result = " + result); for (Tuple tuple : result) { String username = tuple.get(member.username); Integer age = tuple.get(member.age); System.out.println("username = " + username); System.out.println("age = " + age); } } result = [[member1, 10], [member2, 20], [member3, 30], [member4, 40]] username = member1 age = 10 username = member2 age = 20 username = member3 age = 30 username = member4 age = 40 출력값이 위와 같은데 .get()메소드로 꺼내는 걸로 보면 Map과 같은 자료구조인건가 싶기도 하면서, 통째로 출력하면 List<List<>>와 같은 자료구조의 모습이더라구요 tuple은 어떤 자료구조인가요?

  • java
  • jpa
댓글 1 좋아요 0 조회수 1240

join메서드 궁금증입니다 ..

미해결

실전! Querydsl

List<Member> result = queryFactory .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) .fetch(); 위의 QueryDSL문을 sql문으로 번역하면 select * from member as m join team as t on m.team _id = t.team _id where t.name ='teamA' 가 맞나요? 관계형DB를 객체 다루듯이 사용하기 위해 Member안에는 Team 클래스가 있고, Team 클래스 안에는 Member 클래스가 있지만 실제로는 .join(member.team, team) 와 같은 코드를 작성하면 내부적으론 DB의 테이블에 가서 외래키와 기본키를 비교해서 값을 가져오는 건가요 ?

  • java
  • jpa
댓글 1 좋아요 0 조회수 498

순수 EntityManager vs Spring Data JPA 테스트

해결됨

스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션

프로젝트를 하면서 궁금한 점이 생겨 질문드립니다. @AutoConfigureMockMvc와 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) 만 적용한 상태로 테스트 코드를 작성했습니다. 그리고 @Autowired를 통해 순수 EntityManager를 주입받아서 직접 영속성을 관리하는 레포지토리가 있습니다. 그런데 직접 EntityManager를 주입받은 Repository 빈은 테스트 주입 시 EntityManager가 없다는 오류가 발생합니다. 하지만 Spring Data JPA의 JpaRepository를 상속받은 인터페이스를 @Autowired로 주입받으면 이는 문제없이 테스트가 동작합니다. 혹시 어떤 차이점이 있는지 알 수 있을까요? @Repository public class UserRepository { @PersistenceContext private EntityManager em; public User save(final User user) { em.persist(user); return user; } public Optional<User> findByEmail(final String email) { List<User> users = em.createQuery("select u from User u where u.email=:email", User.class) .setParameter("email", email) .getResultList();return users.isEmpty() ? Optional.empty() : Optional.of(users.get(0)); } } public interface UserJpaRepository extends JpaRepository<User, Long> { public Optional<User> findByEmail(final String email); } @ActiveProfiles("test") @AutoConfigureMockMvc @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) class AjaxEmailPasswordAuthenticationFilterTests extends DummyObject { @Autowired private ObjectMapper objectMapper; @Autowired private MockMvc mockMvc; @Autowired private UserJpaRepository userJpaRepository; @Autowired private PasswordEncoder passwordEncoder; @BeforeEach void setup() { userJpaRepository.save(User.builder() .email("test@gmail.com") .username("test") .password(passwordEncoder.encode("1234")).build()); } @DisplayName("이메일 기반 회원가입 유저 로그인") @Nested class LoginByEmailTests { @DisplayName("로그인 성공") @Test void success_test() throws Exception { //given String url = Endpoint.Api.LOGIN_WITH_EMAIL; EmailLoginUserRequestDto requestDto = EmailLoginUserRequestDto.builder() .email("test@gmail.com") .password("1234") .build(); //when ResultActions resultActions = mockMvc.perform( post(url) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(requestDto)) ); //then resultActions .andExpect(status().isOk()) .andExpect(jsonPath("$.id").exists()) .andExpect(jsonPath("$.redirectUrl").exists()); } } }

  • spring-boot
  • junit
jeidiiy 댓글 1 좋아요 0 조회수 732

제공되는 html 파일을 사용해도 될까요?

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

QueryDSL까지 강의를 다 듣고 난 이후에 게시판이나 쇼핑몰 같은 포트폴리오를 만들기전에 자그맣게 배운걸 써보고 싶은데 html,css,js를 모르다보니 view쪽을 처리할 수가 없더라구요. 그래서 혹시 활용1편에 제공되는 HelloShop view단 파일을 사용해도 될지 궁금합니다. 깃허브에 올리려고 하고 백엔드단 코드는 전부 스스로 짤 생각입니다.!

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
댓글 1 좋아요 0 조회수 337

지연로딩과 fetchJoin 성능 차이

미해결

실전! 스프링 데이터 JPA

즉시로딩을 사용하면 Member 객체를 불러 올 때 1+N문제가 발생하고 Lazy로딩을 사용하면 Team 객체를 사용할 때 쿼리문이 나가서 즉시로딩이든 지연로딩이든 결국 1+N 문제가 생기는 게 맞나요 ? 이 1+N 문제의 해결방법으로 fetchJoin이 나온 것 같은데 지연 로딩, 즉시 로딩보다 무조건 fetchJoin이 이점이 있는 것 아닌가요? 왜 디폴트값으로 지연로딩으로 설정하고 fetchJoin을 선택해서 사용하는지 궁금합니다. 기본적으로 fetchJoin을 사용하고 연관관계에 있는 객체를 사용하지 않을 것 같은 경우에만 지연로딩을 선택적으로 사용하는게 더 편하지 않나요? 사용하지 않는 객체를 가져오는 fetchJoin의 쿼리문 몇 줄이 성능에 그렇게 큰 영향을 미치나요?

  • java
  • spring
  • spring-boot
  • jpa
댓글 2 좋아요 1 조회수 653

2분 정도에 이 코드는 안되는 이유가 있나요?

미해결

실전! 스프링 데이터 JPA

Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); memberRepository.save(new Member("member1", 10, teamA)); memberRepository.save(new Member("member2", 10, teamB)); 강의에서 이렇게 한번에 하려다가 Member를 생성해주고 따로 save를 해주던데 한번에 하면 안되는 이유가 있을까요 ?

  • java
  • spring
  • spring-boot
  • jpa
댓글 1 좋아요 0 조회수 331

Page 자료구조에 관해 질문입니다.

미해결

실전! 스프링 데이터 JPA

PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Direction.DESC, "username")); int age = 10; //when Page<Member> page = memberRepository.findByAge(age, pageRequest); PageRequest.of 코드에서 첫 번째 파라미터가 무엇을 의미하는지 헷갈립니다. PageRequest.of 의 2번째 파라미터는 한 페이지의 element 개수이고(limit), 3번째 파라미터는 정렬 조건이 맞나요? List<Member> content = page.getContent(); assertThat(content.size()).isEqualTo(3); assertThat(page.getTotalElements()).isEqualTo(5); assertThat(page.getNumber()).isEqualTo(0); assertThat(page.getTotalPages()).isEqualTo(2); assertThat(page.isFirst()).isTrue(); assertThat(page.hasNext()).isTrue(); page.getContent()는 현재 페이지의 데이터를 가져오는 메소드인가요? page.getNumber()는 현재 페이지를 가져오는 메소드인가요? Page는 책처럼 0,1,2,3 ... 이렇게 페이지가 있는 거고 Content는 그 Page안에 있는 데이터를 의미하는 건가요? List<List<data>> 와 같은 구조로 되어 있는 것일까요? Page와 Content의 자료 구조가 어떻게 되어있는지가 궁금합니다.

  • java
  • spring
  • spring-boot
  • jpa
댓글 1 좋아요 0 조회수 666

@Transactional 에 따른 변경감지 작동여부 질문

해결됨

자바 ORM 표준 JPA 프로그래밍 - 기본편

안녕하세요! 먼저 좋은 강의 감사하다는 말씀 드립니닷! 개인 프로젝트 수행 중에, 변경 감지와 관련한 이슈를 발견해서 질문드립니다. 물론 개인 프로젝트 관련한 질문은 안 받아주시는 것을 충분히 숙지하고 있지만, 개념적인(?) 내용이라 혹시 도움 받을 수 있을까 싶어 질문드립니다. (사실 아무리 생각해봐도 모르겠습니다..ㅠㅠ) 상황 한 트랜잭션 안에서, 엔티티 객체를 만들고 이를 영속성 컨텍스트에 올려 id 값을 받아와 이 id 값을 가지고 해시값을 만들어 해당 해시값을 다시 엔티티 객체에 할당하려 합니다. 문제 문제는 위 작업을 수행하는 메소드의 @Transactional 위치에 따라 변경감지가 될 때가 있고 안 될 때가 있다는 점입니다. 위 쪽의 create(ShortUrlCreateRequest request) 메서드를 호출하여 아래에 오버로딩된 create(String originUrl, Period expirationPeriod) 를 통해 위에 서술한 작업을 하려합니다. (Repository 객체는 Data Jpa Repository를 사용하고 있습니다.) create(ShortUrlCreateRequest request) 를 호출하면, 아래의 create(String originUrl, Period expirationPeriod) 메서드에 @Transactional 을 붙였음에도 아래와 같이 insert 문만 호출됩니다. 이번에는 위의 create() 에 @Transactionl 붙였을 때 입니다. insert 문과 update 문 모두 의도한 대로 호출되는 것을 확인할 수가 있습니다. 트랜잭션 진입 시점이 다른 것인데 왜 이에 따라 변경감지 가 일어나고/ 안 일어나는 지 감을 잡지 못하겠습니다. 일말의 힌트를 주실 수 있을까요? 항상 영한님과 서포터님들께 감사드립니닷!!

  • java
  • jpa
동해물과백두산이마르고닳도록 댓글 1 좋아요 1 조회수 989

뭘 사용할지 선택에 있어서 질문입니다.

미해결

실전! 스프링 데이터 JPA

EntityManger를 주입받는 방법으로 private final EntityManager em; 이렇게 선언하고 @RequiredArgsConstructor로 받을 수도 있고, 이번 강의에서처럼 @PersistenceContext로 받을 수도 있는데 각각의 차이점이 무엇인가요 ? public long count() { return em.createQuery("select count(m) from Member m", Long.class) .getSingleResult(); } 또 여기서 메소드 선언문에는 long 타입을 반환타입으로 설정했는데 createQuery의 2번째 파라미터로는 Long값을 주는데 어떤 이유인지 궁금합니다.

  • java
  • spring
  • spring-boot
  • jpa
댓글 1 좋아요 0 조회수 427

@GeneratedValue에 관한 질문입니다.

미해결

실전! 스프링 데이터 JPA

member = Member(id=3, username=member1, age=10) -> member.getTeam() = Team(id=1, name=teamA) member = Member(id=4, username=member2, age=20) -> member.getTeam() = Team(id=1, name=teamA) member = Member(id=5, username=member3, age=30) -> member.getTeam() = Team(id=2, name=teamB) member = Member(id=6, username=member4, age=40) -> member.getTeam() = Team(id=2, name=teamB) Team을 먼저 persist 했기때문에 team의 id가 1,2가 됐고, 그 뒤에 순차적으로 member의 id가 3,4,5,6이 된 건가요 ? Team은 Team대로, Member는 Member대로 각 엔티티마다 id를 사용하는게 낫지 않나요? 실무에서는 어떤지 궁금하고, 만약 실무에서는 각 엔티티마다 id값을 공유한다면 강의에서는 모든 엔티티가 같은 id값을 공유하는지 궁금합니다.

  • java
  • spring
  • spring-boot
  • jpa
댓글 1 좋아요 0 조회수 291

어노테이션 프로세서 활용 예와 관련해 질문 있습니다.

미해결

더 자바, 코드를 조작하는 다양한 방법

'마무리' 한 강 남았네요. 덕분에 많이 배우고 많이 성장한 것 같습니다. 그런데, 어노테이션 프로세서 활용과 관련해서,, QueryDSL 사용 시 생성되는 엔티티의 Q파일도 어노테이션 프로세서를 활용한 기술인지 궁금합니다. 짐작으로는 맡긴 한데, 관련 언급이 없었어서요.

  • java
  • querydsl
  • jpa
  • spring
najh0528 댓글 1 좋아요 0 조회수 530

인기 태그

인프런 TOP Writers

주간 인기글