묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
일대일 양방향 매핑 시 연관관계 편의 메소드 사용 질문 드립니다.
안녕하세요. 강의 잘 듣고 있습니다. 다름이 아니라, 일대일 매핑에서, 연관관계 편의 메소드를 작성할때 Order, Delivery 객체에 이렇게 편의메소드를 작성하는게 맞는 방법일까요 ?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
static create 메소드
setter를 쓰기보다, static create로 메소드를 만들어 주는게 좋다고 하셨는데, 생성자 메소드로 만들지 않고, 왜 일반 정적 메소드로 만드시는지 궁금합니다..
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 강사님 질문있습니다.
첫번째로 제가 api란 용어를 application program interface라고 알고 있는데 맞나요? 두번째는 1번째 강의에서 만든건 API라는게 적용이 안된 프로젝트인가요? API개념이 햇갈려서요;;; 세번째로는 postman을 깔긴 깔았는데요 왜 이걸로 테스트를 하는거에요? 그냥 첫강의때처럼 쌩으로 크롬같은데서 켜서 하는거랑 무슨차이인가요? 네번째는 @RequestBody에 대해서인데요. 이 어노테이션이 파라미터에 붙으면 ajax에서 json 형태로 전송하면 그 전송한걸 받는 곳에 이걸 붙으는걸로 알고 있는데 맞나요? 그래서 postman에서 json형태로 컨트롤러쪽에 post형태로 쏴줬으니 저 어노테이션을 붙인 곳에 바인딩된다고 생각을 하면 되는게 맞지요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
save() 메소드에서 member를 리턴하는 이유가 뭔가요??
안녕하세요. 좋은 강의 감사하게 잘 보고있습니다. MemoryMemberRepository에서 Member를 리턴하는 이유가 있는지 궁금합니다. store에 저장만하면 save()의 기능은 끝나는거 아닌가요? 굳이 member를 리턴하는건 왜 그런건가요??
-
해결됨스프링 시큐리티
get 요청으로 민감한 정보를 가져오는경우
안녕하세요 기선님 항상 좋은 강의 감사합니다 !! :) Http get 요청으로 민감한 정보를 가져오는 경우에 보안을 위해 get 요청에도 csrf 토큰값을 확인하는 과정을 거치고 싶다면.. CsrfFIlter 의 코드를 추적해보니 private static final class DefaultRequiresCsrfMatcher implements RequestMatcher { private final HashSet<String> allowedMethods = new HashSet<>(Arrays.asList("GET", "HEAD", "TRACE", "OPTIONS")); @Override public boolean matches(HttpServletRequest request) { return !this.allowedMethods.contains(request.getMethod()); } @Override public String toString() { return "CsrfNotRequired " + this.allowedMethods; }} 이렇게 DefaultRequiresCsrfMatcher 를 사용해 GET, HEAD, TRACE, OPTIONS 요청인 경우에는 다른 도메인에서 온 요청에도 응답을 해주는 설정을 하는거 같고, 이 부분을 수정하면 될거같은데 시큐리티 설정 클래스에서 http.csrf().requireCsrfProtectionMatcher() 다음과 같은 방법으로 수정하면 되는게 맞을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Ctrl + Alt + M 단축키가 안되는 분들 보세요!
Geforce Experience가 설치된 분들에 한해서 Ctrl + Alt + M(Extract Method) 단축키가 작동하지 않는 오류를 발견했습니다. Geforce Experience를 켜고 설정에서 빨간색 네모 친 게임 내 오버레이 기능을 OFF하시면 단축키가 잘 작동할 것입니다!
-
해결됨스프링 시큐리티
csrf 토큰
안녕하세요 기선님 좋은 강의 감사드립니다!! :) 흐름을 살펴보니 csrf필터를 거치는 요청의 경우 csrf 토큰이 없는 경우 csrf 토큰을 생성해서 요청을 반환하고, 폼요청을 보낼 때, 반환받은 csrf토큰을 같이 보내는 것 같은데, 그럼 서버쪽에서는 생성해준 csrf 토큰의 값을 어디서 보관하고 있는건가요? csrf 토큰을 포함한 요청이 왔을때 비교를 하기 위해선 반환한 토큰값을 서버측에서도 어디선가 유지하고 있어야 할텐데 그 부분이 어디일지 또 언제까지 유지하는지 궁금해서 질문남깁니다!! ======================= 질문을 남기고 구글링을 통해 찾아본 결과는 CsrfTokenRepository를 사용해서 토큰정보를 가지고 있는 것같은데 기본구현체는 HttpSessionCsrfTokenRepository를 사용하는 것으로 보아 Session을 기반으로해서 토큰 정보를 유지하고, session이 사라지면 자연스럽게 토큰 정보도 날라가는것 처럼 보이는데 맞을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
list 초기 값 문의드립니다.
안녕하세요 강의 잘 듣고 있습니다 ^^ jpa와는 관련이 없는 질문인데 강의를 보면 List<Child> childList = new ArrayList<>(); addChild(Child child) { childList.add(child) } 이 부분이 있는데 add가 자주 발생하면 LinkedList가 좋다고 이해했는데 초기 리스트는 업무에 따라서 ArrayList나 LinkedList를 선택해서 생성하나요? 아니면 보통 ArrayList를 무조건 사용하나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
src/test/resources/application.yml 인식 문제입니다.
안녕하세요 강사님! 테스트 수행 중 application.yml 파일을 test 밑에 두고 따라하는중에 application.yml 파일을 찾지 못하고 자꾸 main 밑에있는 파일을 불러왔습니다. 찾아보니 test/resources/config/application.yml 로 두어야 인식한다고 되어있고 저도 config 디렉토리를 생성해 그 밑에 두었더니 별도의 application.yml 파일로 읽어오더라구요. https://stackoverflow.com/a/53134737 인텔리제이로 학습중인데 이부분 한번 확인 부탁드리겠습니다!
-
미해결스프링 시큐리티
프로젝트는 직접 만들어야하나요?
챕터 1,2 건너뛰고챕터 3부터 들으려고 합니다.근데 프로젝트 만드는건 각자한다해도안에 기본적인 컨트롤러나 뷰계층 파일들 다 만들어져있는 상태에서 강의 진행하시는데 이건 각자 알아서 만드나요?깃허브 주소 공유해주신건 완성본인데여기서 필요한것만 가져와서 플젝을 만들어야하나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
기본 생성자에 관해 질문드립니다.
13:43 부분을 보면 JPA 는 내부적으로 리플렉션을 통해서 객체를 생성하기 때문에 기본 생성자가 필요하다고 하셨는데요. 다음과 같이 기본 생성자는 생성하지 않고 코드를 돌리더라도 문제없이 돌아가던데, 내부적으로 기본생성자가 없더라도 동작하도록 변경이 된걸까요.? 추가) 추가적으로 강의를 진행 하던 중에 em.find() 로 실행하니 이제는 디폴트 메소드가 없다고 에러메시지가 출력이 되네요. persist() 할 때는 출력되지 않던 에러가 find() 에서는 출력되는데 어떤 메커니즘 차이 때문에 이런 결과가 발생하는 건가요.?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품 등록시에 데이터 받는 로직
안녕하세요따로 공부하다가 궁금한 점이 생겨서 질문 남깁니다. item에서 InheritanceType.JOINED 를 사용하게 되면 화면에서 컨트롤러로 Form data를 받아와서 처리하는 로직은 어떤식으로 구현을 하는게 효과적인가요? 예를들면 formData에 타입을 넣어줘서 if else문으로 각각에 맞는 Controller(formData){if(formData.getType equals "B") persist( new B(formData.a formData.b , formData.c)) else if ("A") persist( new A(formData.dd formData.gg ) else if ~~~~} 이런식으로 전부 빼야 하나요?? 만약 위와 같은 상황이라면 타입이 엄청나게 많아지는 경우 무한if else을 쓰기는 좀 비효율적인 코드가 될 거 같아서 질문드립니다.
-
해결됨스프링 시큐리티
application.properties 를 통해 기본유저 정보를 변경
혹시, application.properties 를 통해 기본유저 정보를 변경하고 동작이 잘 되지 않으시는 분들은 크롬 프라이빗 모드로 캐시를 날리고 해보세요! 한 시간 가까이 해맸는데, 크롬 프라이빗 모드로 하니 제대로 동작하네요! 첫 강의에서 개발할때 해당 모드를 사용해서 하는게 편하다고 하셨는데 그 이유를 절감했네요 ...
-
해결됨실전! Querydsl
읽기전용 entity 만들기
안녕하세요. 다른 사람이 만든 DB의 데이터를 가져와서 가공하여 제공하는 API를 만들려고 합니다. spring data jpa + querydsl 환경이고 읽기전용 entity를 만들려고 합니다. 기본편도 들었지만 entity를 만들면서 db도 생성되었기에 읽기전용 entity를 어떻게 만드는지 혹여나 컬럼 혹은 데이터 수정이 되지 않을지, entity를 만들때 모든 컬럼을 다 정의해야되는지 등의 개념을 파악하기가 힘듭니다. 검색해봐도 잘 나오지 않네요. 혹시 답변 가능하실까요? 참고할만한 사이트 혹은 개념이라도 알려주시면 찾아서 해보겠습니다. 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
source folder 설정법
안녕하세요 Eclipse 환경에서 강사님 강의를 따라하고 있습니다. MemberServiceIntegration.java의 테스트가 불가능하고 " The input type of the launch configuration does not exist "라는 오류가 뜹니다. 찾아보니 intellij에선 상관없지만 eclipse에서 발생하는 문제이며, source folder로 등록되어 있지 않기 때문에 발생한다고 하는데 build path 통해서 확인해보니 사진과 같습니다. 존재하긴 하는데 다른 폴더들과 달리 진하게?? 되어있어 source folder로 등록되어 있는 것이 맞는지 의문입니다. gradle 환경에서 따로 source folder를 강제로 등록시키는 방법이 있을까요??
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
dto에서의 join질문이있습니다.
좋은강의감사합니다. 질문이있습니다. 엔티티조회방식에선 fetch join을 했는데, 여기에선 왜 일반 join을 하는 것인가요??
-
미해결실전! Querydsl
연관관계 메소드 질문
안녕하세요 강사님. 기본강의에서도 연관관계 메소드를 공부하여 알고 있었습니다. 양방향 연관관계에서 주인이 되는 쪽을 수정하면 주인이 아닌쪽에서도 자동으로 수정이 되지만 객체의 개념으로 접근하기 위해 양쪽을 모두 수정해주는 연관관계 메소드가 필요한것인가요? 주인이 되는 쪽만 잘 수정해주면 사실상 연관관계 메소드가 필요 없는 것이지요? 그렇다면 changeTeam 연관관계 메소드를 이용해서 팀을 바꾸었을때 바뀐 팀의 멤버를 추가하는 것이 맞다면 반대로 바뀌기 전의 팀에서도 멤버를 제거해야되는것이 아닌가요? 예를 들어서 팀1 -> 멤버1 팀2 -> 멤버2 에서 멤버1을 팀2로 옮길시 연관관계 메소드는 add만 해주시기때문에 팀1 -> 멤버1 팀2 -> 멤버2, 멤버1 로 되어 제거를 해주어야 한다고 생각합니다. 하지만 테스트 결과 주인이 되는 쪽을 수정하니 자동으로 멤버1이 제거가 되더군요. 이 또한 객체의 개념을 살리기 위해 제거가 자동으로 되지만 제거가 되는 remove()를 추가해줘야 할까요?
-
미해결실전! 스프링 데이터 JPA
jpql update 문 관련 질문
갑자기 궁금증이 생겨 질문드립니다. 벌크 연산은 member2에 age를 +1시켜줍니다. 이떄 db에 쿼리가 넘어가서 db상에 member2 age는 5가되고 영속성컨테스트안에 member2 age는 4가 그대로 유지됩니다. 이 상황에서 플러쉬를 하면 왜 변경감지가 일어나지 않나요? Member member1=new Member("member1",2,null);Member member2=new Member("member2",4,null);memberJpaRepository.save(member1);memberJpaRepository.save(member2); int i = memberJpaRepository.bulkAgePlus(3); em.flush();
-
미해결실전! 스프링 데이터 JPA
리포지토리 분리
리포지토리를 분리하신다고 하셨는데1. 정말 간단한 쿼리는 스프링 데이터 JPA 리포지토리에서 구현, 쿼리메서드 기능들을 이용하고조금 복잡하고, 강의에서 설명해주신 다양한 이유에 해당하면 사용자 정의 리포지토리를 구현해서 사용하고더 복잡한 동적쿼리들은 따로 클래스를 만들어서총 3개의 리포지토리를 운영하게 되는건가요?2. 서비스와 리포지토리는 1:1로 매핑하는게 좋다고 들었는데 그럼 3개의 서비스클래스도 따로 만드나요?3. 핵심 비즈니스 로직과 단순 화면 관련 로직도 구분은 서비스계층에서 이루어지나요? 그럼 하나의 서비스에서 두개의 리포지토리를 접근해도 괜찮나요??아직 아키텍처를 고민할만한 실력은 아니지만궁금점이 해결되지 않아 질문남깁니다..
-
해결됨스프링 데이터 JPA
비동기 쿼리
안녕하세요 기선님 항상 좋은 강의 감사드립니다! 매 영상마다 질문을 남기는 것 같아 죄송하네요.. 비동기 쿼리에 대한 내용을 제 나름대로 요약해서 해석해보려 노력중인데 곡해가 있을까 걱정이 되어 이렇게 글을 남깁니다. 비동기 쿼리를 사용하는 것을 보니, 쿼리를 날리고 데이터를 받아오기 전까지 메인 쓰레드를 놀리지 않기 위해 비동기 쿼리를 사용하는 것으로 보입니다. 그런데 Future 을 사용하면 결국 get 으로 받아오는 작업에서 메인쓰레드가 블로킹이 되니까 Future 보단 콜백메서드를 사용할 수 있는 ListenableFuture 을 사용하는 걸 추천하신거라고 이해 됩니다. 그렇다면 여기서 조금 쓸모없는(?) 작업이긴 하지만 Future 의 get 을 받는 Thread 를 직접 구현해도 되겠다는 생각도 듭니다. 그리고 비동기 쿼리에 대한 테스트 코드 작성이 어려운 이유는 테스트의 특성상 위 테스트는 작업 전체가 한 트랜잭션이 될 테고, save 된 데이터를 가져오기 위한 쓰레드가 작업을 마치기도 전에 메인쓰레드가 끝나버리면서 하이버네이츠의 DB에 변화를 가져오지 않는 쿼리는 날리지도 않는 특성에 의해 insert 쿼리 조차 날라가지 않는 테스트가 되는 거구요. 의도적으로 flush() 를 통해 insert 를 할 수 는 있으나, insert 와 같은 트랜잭션 안에서 시작된 select 쿼리는 그 트랜잭션 내에서 insert가 된 데이터를 인지할 방법은 없게 된다는 설명으로 이해했습니다. 그렇다면.. 테스트를 위해서 @BeforeEach 를 통해 데이터를 먼저 집어넣은 상태로 동작을 확인할 수 있진 않을까 했지만, 이 작업자체도 DB의 변화를 일으키는 작업이 아닌만큼 하이버네이츠가 insert 를 날리지조차 않더군요. 그래서 위 코드에서 flush()를 추가하여 insert를 날렸지만.. 결과는 이렇더군요... 그런데 제 나름대로의 해석으로는 마지막 결과가 조금 이해가 되지 않네요.. 데이터를 집어넣었고 select 를 하는게 보이는데, size 는 0 이뜨고 근데 또 테스트는 성공하네요.. @BeforeEach도 결국은 한 트랜잭션안에서 동작하여 기존의 테스트 코드처럼 내부에서 Comment를 insert 하는 것과 동일한 작업인것인지.. 근데 또 테스트는 어떻게 성공한건지... 어디가 잘못된걸까요? 또 만약,, 제가 이상하게 이해한 부분이 있는 것 같다면 알려주시면 너무 감사하겠습니다!!