묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 시큐리티
SessionManagementFilter의 대한 문의드립니다.
https://www.inflearn.com/course/lecture?courseSlug=%EC%BD%94%EC%96%B4-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0&unitId=29835&tab=curriculum해당 강의를 듣고 질문이 있습니다.FilterChainProxy의 시큐리티 필터 목록을 보면 SessionManagementFilter가 별도로 있는데요.강사님이 설명해주신 내용과 ppt를 보면, UsernamePasswordAuthenticationFilter에서 호출되는 CompositeSessionAuthenticationStrategy의 strategy들을 SessionManagementFilter라 말씀하시는 것 같습니다.그럼 시큐리티 필터 목록에 있는 SessionManagementFilter는 언제 호출되는걸까요?혹시라도 제가 잘못 이해한 부분이 있다면, 피드백 부탁드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
No tests found for given includes: [ooo.ooo.oooTests](--tests filter)
테스트 도중No tests found for given includes: [ooo.ooo.oooTests](--tests filter)intellij ide 사용중인데 해당 에러가 뜹니다.해결방안으로 settin -> Run test using -> Gradle에서 intelliJ IDEA로 변경하면테스트 케이스가 잘 작동하는데요.이유가 무엇인가요??인텔리제이는 왜 실행이 되고그레들로는 실행이 안되는지도 궁금합니다. 스프링 부트 2.7.10gradle 2.6.1java 11버전입니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JOIN FETCH와 1차 캐시 질문드립니다.
JOIN FETCH를 이용하여 쿼리를 작성하고 테스트 해보던 중에 이해가지 않는 동작이 발견되어 질문드려요!JOIN FETCH로 채우려는 필드가, 1차 캐시에 엔티티가 이미 존재할 때에, 해당 필드가 null 이 되는 현상입니다.오히려 영속성 컨텍스트를 비워주면 프록시를 가져오는 것 같습니다... 어떻게 동작하는 건지 질문 드립니다!테스트 메서드를 간단하게 작성하며 생성 및 조회를 하나의 트랜잭션에서 진행했습니다.엔티티는 간략하게 다음과 같습니다.@Entity public class Collection { @Id @GeneratedValue private Long id; @OneToMany(fetch = FetchType.LAZY, mappedBy = "collection", cascade = CascadeType.ALL, orphanRemoval = true) private List<ReviewInCollection> reviews = new ArrayList<>(); // ... } @Entity public class ReviewInCollection { @Id @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "COLL_ID") private Collection collection; @Id @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "REV_ID") private Review review; // ... } @Entity public class Review { @Id @GeneratedValue @Column(name = "REV_ID") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "PLACE_ID", nullable = false) private Place place; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "MEMBER_ID", nullable = false) private Member member; // ... } 문제가 발생한 코드입니다. @Test void updateReviewsTest() { final SessionImplementor session = em.unwrap(SessionImplementor.class); final PersistenceContext pc = session.getPersistenceContext(); // mock up //!=========================================================================================!// em.flush(); // em.clear(); Collection coll = em.createQuery( "select c from Collection c " + "join fetch c.reviews cr " + "join fetch cr.review r where c.id = :collId ", Collection.class) .setParameter("collId", 1L) .getSingleResult(); coll.getReviews() // ReviewInCollection .stream() .map(cr -> cr.getReview() // Review → NPE .getId() ) .toList(); } Cannot invoke "com._2cha.demo.review.domain.Review.getId()" because the return value of "com._2cha.demo.collection.domain.ReviewInCollection.getReview()" is null java.lang.NullPointerException: Cannot invoke "com._2cha.demo.review.domain.Review.getId()" because the return value of "com._2cha.demo.collection.domain.ReviewInCollection.getReview()" is nullJOIN FETCH 를 통해 Collection.reviewsReviewInCollection.review를 채워 오고자 했는데,Collection → for each ReveiwInCollection → review 가 null 로 채워지게 됩니다.> 쿼리 이전의 영속성 컨텍스트입니다.> 쿼리 이후 영속성 컨텍스트입니다. 주석 처리한 em.clear() 를 실행하면, null이 아닌 프록시로 가져와서 LAZY 방식으로 Review를 채웁니다. LAZY 또한 예상한 동작이 아니긴 하나, 일단 왜 null이 들어가는지가 가장 궁금합니다... 영속성 컨텍스트와 JOIN FETCH의 충돌이 있는 걸까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
11분 쯤에 프록시 관련하여 질문입니다.
지연 로딩을 사용하면 그 객체를 사용할 때 프록시 객체에서 영속성 컨텍스트에 연결을 요청해서 진짜 객체를 가져오는 거로 알고 있는데요이번에는 단순히 Order만 Return 했기 때문에 Order객체 안에 있는 프록시 객체(Member, Delivery, OrderItems)는 사용할 일이 없는 것 아닌가요 ?왜 프록시 객체를 사용하려다 문제가 발생했는지 알 수 있을까요?
-
미해결스프링 기반 REST API 개발
이벤트 Repository강의 중 Event 클래스에 private Integer Id; 위치 질문
이벤트 Repository강의 중 Event 클래스에 private Integer Id; 이 한줄의 위치가 맨 위가 아니면 에러가 납니다.왜 그런건가요? (저는 강의 순서대로 입력하느라 아래쪽에 입력했었습니다.) 에러내용은 : org.springframework.orm.jpa.JpaSystemException: Unknown integral data type for ids : java.lang.String
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
clearStore cannot find symbol
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.코드를 정상적으로 작성했음에도 불구하고 오류가 납니다. file-invalidate caches 후 다시 실행하여도 같은 오류가 발생됩니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
오류발생
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요.똑같이 했는데 저부분이 오류가 발생합니Cannot resolve method 'hasText' in 'StringUtils'이렇게 나옵니다
-
미해결2. 웹개발 코스 [JAVA 개발언어]
javaSE-20 이 없습니다...
자바 최신버전인 20.0.1버전을 설치했는데 create a java project 에서 jre선택하는데 javaSE-19가 끝입니다/... 그냥 그거 선택해서 진행해도 괜찮을까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
distinct 사용 전 데이터 뻥튀기 현상이 일어나지 않습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강사님과 코드를 똑같이 작성했는데 distinct를 사용하기 전에도 데이터 뻥튀기 없이 올바르게 데이터가 나옵니다. 제가 어떤 부분을 잘못한 건지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
format_sql 안됨
server: port: 80 spring: jpa: hibernate: ddl-auto: none properties: hibernate: # show_sql: true format_sql: true logging.level: org.hibernate.SQL: debug # org.hibernate.type: trace logging: level: org: hibernate: persister: entity: debug 디비연동은 잘해놨습니다. 그런데 로그가 정리가 안되네요..format_sql: true 이게 안먹는것같습니다.ㅠㅠ 버전은 2.6.0 인데 버전문제일까요?
-
미해결실전! 스프링 데이터 JPA
createQuery
public List<Member> findByPage(int age, int offset, int limit){ return em.createQuery("select m from Member m where m.age = :age order by m.username desc") .setParameter("age", age) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); }em.createQuery("select m from Member m where m.age = :age order by m.username desc", Member.class)아래처럼 끝에 반환하는 클래스 타입을 적어줘야 된다고 기억을 하는데 위에 코드 처럼 적어주지 않아도 정상적으로 작동을 하더라구요? 반면에public long totalCount(int age){ return em.createQuery("select count(m) from Member m where m.age = :age") .setParameter("age", age) .getSingleResult(); }totalCount 의 경우 클래스 타입을 안적어주면 바로 빤갈줄이 그어지는데 반환하는 클래스 타입이 생략이 가능한 경우도 있는건가요??
-
해결됨자바 코딩테스트 - it 대기업 유제
블로그 문제 첨부 가능 여부
블로그에 학습한 내용을 올리고 싶은데문제 자료를 캡쳐해서 사용해도 괜찮나요??!
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
형 변환 질문
숫자를 문자열로 바꿀때 String.valueOf(); / Integer.toString(); 이 두가지를 사용하여 알려주셧는데 퀴즈에서 String busNO = "1234"; 를 사용하니 1234가 문자열로 바뀌었더라구요. (sout(busNo + 10)을 입력하니 123410이 나왔습니다.)위에서 알려주신 두가지 방법과 퀴즈에 나온 방법이 무슨 차이가 있을까요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
형변환 후반전 질문
93과 98.8을 각각 문자열로 변환한 다음에 저희가 사용하는 07 폴더에서는 계속해서 93과 93.8이라는 숫자는 컴퓨터가 숫자가 아닌 문자열로 인식된 상대 인가요? (93과 98.8을 더하면 9398.8인 형태로) 그 다음에 다시 문자열을 숫자로 바꾼 과정에서 컴퓨터가 숫자로 인식을 하는건가요?(93과 98.8을 더하면 191.8인 형태로)
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
8:41 질문
@PutMapping("/api/v2/members/{id}") public UpdateMemberResponse updateMemberV2( @PathVariable("id") Long id, @RequestBody @Valid UpdateMemberRequest request) { memberService.update(id, request.getName()); return new UpdateMemberResponse(id, request.getName()); } 파라미터로 들어온 값으로 UpdateMemberResponse를 만들어주지 않고 memberService.findOne을 통해 하는 이유가 있을까요?
-
해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
무결성 제약조건이 위배되는 경우에 대한 예외처리에 대해 질문드립니다
안녕하세요 강사님. Kotlin + JPA에 대해 마땅히 질문남길 곳이 없어서 질문드리게 되었습니다😅 Book 엔티티에서 name을 유니크 키로 지정해서 중복된 값을 설정하려고 하면 아래처럼IllegalArgumentException을 던져주게 하는 코드를 작성하고자 했습니다.@Transactional fun saveBook(request: BookRequest) { val book = Book(request.name, request.type) try { bookRepository.save(book) } catch (e: DataIntegrityViolationException) { throw IllegalArgumentException("이미 등록된 도서입니다.") } }그런데 JPA의 영속성 컨텍스트로 인해 @Transactional이 붙은 메소드에서 DataIntegrityViolationException를 처리해주기 위해선 flush()를 직접 호출해서 쿼리를 실행시켜야 한다는 것을 알게되어 아래와 같이 코드를 수정했고, 테스트 코드에서 정상적으로 IllegalArgumentException이 처리되는 것을 확인할 수 있었습니다.@Transactional fun saveBook(request: BookRequest) { val book = Book(request.name, request.type) try { bookRepository.save(book) bookRepository.flush() } catch (e: DataIntegrityViolationException) { throw IllegalArgumentException("이미 등록된 도서입니다.") } }이렇게 코드를 작성해놓고 보니 하나의 메소드에서만 이렇게 무결성 제약조건 위배에 대한 처리를 한다면 상관이 없겠지만 여러 메소드에서 무결성 제약조건을 위배하는 경우에 대해 각기 다른 메시지를 담은 예외를 던지게 된다면 중복 코드가 너무 많이 발생할 것 같다는 생각이 들더라구요. 이런 경우에 아래처럼 확장함수와 람다를 사용해서 예외 처리를 해도 괜찮을까요?inline fun <reified T, ID, R> JpaRepository<T, ID>.flushOrThrow(exception: Throwable, block: JpaRepository<T, ID>.() -> R): R { try { val result = block() flush() return result } catch (e: DataIntegrityViolationException) { throw exception } }@Transactional fun saveBook(request: BookRequest) { val book = Book(request.name, request.type) bookRepository.flushOrThrow(IllegalArgumentException("이미 등록된 도서입니다.")) { save(book) } }이런 방법을 썼을 때 코드가 너무 복잡해지진 않을지, 협업을 하는 경우에 문제가 되진 않을지, 이런 경우가 발생하면 다른 분들은 어떤 방법을 사용하시는지 고민되어 질문 남깁니다!🙏
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
뭐를 잘못 클릭해나 봅니다.
제가 뭘 잘못 눌렀는지 저 파란색 드래그 부분이 하얀색 이 되면서 엔터키를 눌러도 } 중괄호들이 내려가지 않고 그대로 멈춰 있었습니다. 탭키를 눌러도 그자리에 그대로 고정된것 처럼 있더라고창을 닫으니 해결되긴 했는데 왜 저렇게 됐는지 혹시 아시나요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
게시물과 첨부파일의 연관관계 매핑 방법
안녕하세요해당 강의를 너무너무 잘 보고있고, 학습내용을 토대로 사이드 프로젝트를 진행 중입니다.그런데 대표적인 예로 게시물과 첨부파일의 연관관계 매핑을 어떤 식으로 진행해야 하는지 헷갈려서 질문 드립니다. 제가 생각한 방법은 두 가지가 있습니다.첫 번째는 게시물과 첨부파일의 관계에서 게시물 쪽에 단방향 매핑 하는 방법과,두 번째는 게시물과 첨부파일의 관계에서 어떤 매핑도 없이 첨부파일 아이디만 게시물 DB에 저장하는 방식입니다.두 방법 모두 첨부파일을 먼저 영속성 컨텍스트에 저장한 후 게시물을 등록할 수 있는 방법으로 아는데, 실무에서는 어떤 식으로 관계를 설정하고 있는지 궁금합니다!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
빌드 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.스프링부트 3.0 와 java 17을 사용하였습니다. cmd에서 gradlew를 실행하자다음과 같은 오류가 계속 뜹니다. A problem occurred configuring root project 'hello-spring'.> Could not resolve all files for configuration ':classpath'.> Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.0.6.Required by:project : > org.springframework.boot:org.springframework.boot.gradle.plugin:3.0.6> No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.0.6 was found. The consumer was configured to find a runtime of a library compatible with Java 8, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '7.6.1' but:- Variant 'apiElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.6 declares a library, packaged as a jar, and its dependencies declared externally:- Incompatible because this component declares an API of a component compatible with Java 17 and the consumer needed a runtime of a component compatible with Java 8- Other compatible attribute:- Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1')- Variant 'javadocElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.6 declares a runtime of a component, and its dependencies declared externally:- Incompatible because this component declares documentation and the consumer needed a library- Other compatible attributes:- Doesn't say anything about its target Java version (required compatibility with Java 8)- Doesn't say anything about its elements (required them packaged as a jar)- Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1')- Variant 'mavenOptionalApiElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.0.6 declares a library, packaged as a jar, and its dependencies declared externally:- Incompatible because this component declares an API of a component compatible with Java 17 and the consumer needed a runtime of a component compatible with Java 8- Other compatible attribute:- Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1')- Variant 'mavenOptionalRuntimeElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.0.6 declares a runtime of a library, packaged as a jar, and its dependencies declared externally:- Incompatible because this component declares a component compatible with Java 17 and the consumer needed a component compatible with Java 8- Other compatible attribute:- Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1')- Variant 'runtimeElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.6 declares a runtime of a library, packaged as a jar, and its dependencies declared externally:- Incompatible because this component declares a component compatible with Java 17 and the consumer needed a component compatible with Java 8- Other compatible attribute:- Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1')- Variant 'sourcesElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.0.6 declares a runtime of a component, and its dependencies declared externally:- Incompatible because this component declares documentation and the consumer needed a library- Other compatible attributes:- Doesn't say anything about its target Java version (required compatibility with Java 8)- Doesn't say anything about its elements (required them packaged as a jar)- Doesn't say anything about org.gradle.plugin.api-version (required '7.6.1') setting 과 project structure 에서 모두 17로 설정했는데도 같은 오류가 반복됩니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
변경감지를 통한 데이터 변경에 대해서
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 김영한님 JPA강의를 모두 듣고 개인프로젝트를 하던 중에 궁금한 점이 생겨서 질문 올리게 되었습니다.김영한님께서 데이터의 업데이트는 변경감지를 통해서 하는 것이 좋다고 말씀하셨던 게 기억이 나는데요. 물론 변경감지만을 이용하라는 말씀은 아니시겠지만 변경감지를 통한 업데이트를 어디까지 사용해야 하는 가에 대해서 좀 의문이 생겼습니다.예를 들어 이런 경우입니다.회원이 게시판을 조회하면 조회수를 조회수를 증가시키는 로직인데요. (조회수 증가와 게시판 조회를 서로 다른 트랜잭션으로 했음)이럴 때에 변경감지를 통해서 조회수를 증가시킬 경우에 변경감지를 통해 변경된 값이 그대로 update되는 형태를 취하는 것인데, 이럴 경우 요청이 한 번에 많이 들오면 update순서가 보장되지 않아 정확한 조회수 증가가 이뤄지지 않을 것 같았습니다. 하지만 그렇다고 LOCK을 걸자니 조회수 하나 때문에 게시판 조회까지 LOCK이 걸려 조회 속도를 낮추는 것도 문제인 듯 하였습니다. 생각해 보면 이러한 조회수 증가는 쿼리를 UPDATE .. SET column = column +1 이런 식으로 만들고 처리하면 현재 컬럼의 값을 기준으로 1씩 증가하기 때문에 LOCK을 걸 필요도 없고 순서에 상관없이 일관된 값이 보장될 것 같은데 변경감지를 통해 값을 업데이트 하는 방식을 사용하면 현재 조회된 Entity의 조회수 값에 1을 추가하고 그 값으로 직접 UPDATE되는 형태라서 문제가 된 것이 아닐까 싶었습니다.이런 경우 UPDATE쿼리를 따로 날려 주는 방식이 더 효율적인 방식이 맞을까요? 실무에서는 어떤 방식을 취하고 있는 지 궁금합니다..!