묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 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이 사라지면 자연스럽게 토큰 정보도 날라가는것 처럼 보이는데 맞을까요?
-
미해결실전! 스프링 부트와 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 인텔리제이로 학습중인데 이부분 한번 확인 부탁드리겠습니다!
-
해결됨스프링 핵심 원리 - 기본편
AppConfig에서 MemberRepository 객체 생성에 관하여 질문있습니다.
현재 AppConfig에선는 MemberService, OrderService 둘 다 memberRepository()를 통해 MemoryMemberRepository 객체를 주입 받고 있습니다. 하지만 memberRepository()를 호출할 때마다 MemoryMemberRepository 객체가 새로 생성됩니다. 따라서 MemberService와 OrderService는 서로 다른 Repository를 참조하고 있습니다. 이렇게 서로 다른 MemoryMemberRepository를 참조해도 되는지 여쭤보고 싶습니다. 아니면 저장소인 store를 static으로 선언했기 때문에 서비스간 참조하는 객체는 다르지만 store는 공유하고 있기 때문에 상관없을까요? 아니면 추후에 서비스들이 하나의 MemberRepository만 참조하도록 하는게 나을까요?
-
미해결스프링 핵심 원리 - 기본편
싱글톤 DIP 위반에 관한 질문입니다.
이전 강의와, 이번 강의 내에서, 싱글톤 패턴을 사용하는 경우 DIP 위반이라고 말씀하셔서 질문 드립니다. 과거 강의에서 작성한 AppConfig 클래스 내부에 public MemberRepository memberRepository() { return MemoryMemberRepository.getInstance(); } 이런식으로 작성한다면, 예전에 말하셨던 Configuration(구성?) 하는 부분만 변경될 뿐, 사용하는 부분에서는 new AppConfig().memberRepository 를 하면 되는데 왜 DIP 위반이라고 하시는지 궁금해서 질문드립니다. ^_^
-
미해결실전! 스프링 부트와 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 를 통해 기본유저 정보를 변경하고 동작이 잘 되지 않으시는 분들은 크롬 프라이빗 모드로 캐시를 날리고 해보세요! 한 시간 가까이 해맸는데, 크롬 프라이빗 모드로 하니 제대로 동작하네요! 첫 강의에서 개발할때 해당 모드를 사용해서 하는게 편하다고 하셨는데 그 이유를 절감했네요 ...
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 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을 하는 것인가요??
-
미해결스프링 핵심 원리 - 기본편
싱글톤 주의할점 강의에 대하여 궁금한 점이 있어 질문드립니다~!!
선생님~! 해당 싱글톤 주의할점에서 싱글톤은 무상태로 유지해야한다고 하셨습니다. 때문에 강의에서 지역변수 userAprice 와 userBprice를 만들어서 처음에 입력된 userAprice에 입력된 값이 출력되도록 변경하셨는데, 이게 현재 user가 2명이어서 괜찮았지만 만약에 정말 1초마다 5만명씩 유저가 가격을 입력한다면, 지역변수를 순간적으로 5만개씩 만들어서 처리하는 건지, 아니면 다른 방법으로 해당 사항을 해결하는 건지 궁금합니다 !! (공유객체의 참조와 지역변수의 관계에 대하여 조금이해가 않되서 질문드립니다. ㅠㅠ)
-
미해결실전! 스프링 데이터 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 하는 것과 동일한 작업인것인지.. 근데 또 테스트는 어떻게 성공한건지... 어디가 잘못된걸까요? 또 만약,, 제가 이상하게 이해한 부분이 있는 것 같다면 알려주시면 너무 감사하겠습니다!!
-
해결됨스프링 핵심 원리 - 기본편
이번 강의가 아닌 앞으로의 개발에 관해 문의 드립니다.
안녕하세요 강의 정말 잘 보고 있습니다. 다름이 아니고 아직 강의를 다 보지는 못했지만 강의 완료 후 추후 어떻게 공부 혹은 새로운 지식을 습득해야할지에 대해 궁금해 글올립니다. Spring강의를 통해 Spring을 알게되어 좋은 한편 강의를 다 듣고 추후 새로운 버전의 Spring이 혹은 그 Spring을 뛰어넘는 새로운 프레임워크나 툴들이 나왔을때 어떻게 정보를 알고 공부를 해야할지 궁금해서요 언제까지나 강의가 나오기만을 기다릴수는 없는거고 매뉴얼은 중간중간 찾아볼수는 있으나 기초부터 매뉴얼만 보고 공부하는건 무리인듯 싶어서요 몇가지 질문을 요약드리자면.. 1. Spring에 대해 처음 접하실때 혹은 다른 새로운 기술들을 접하실때 어떻게 공부하시는지 궁금합니다.(원서?, 국내도서?, 매뉴얼?) 2. 혹시 개발동향이나 최신 정보를 얻기위해 주로 가시는 웹사이트가 있다면 추천해 주실수 있으실까요? 아직 마지막영상까지 보지를 않고 질문을 드려 남은 영상에서 답변을 주실수도 있을텐데 너무 궁금한 마음에 문의드립니다 아, 그리고 HTTP 관련 강의 먼저 올려주신다고 하셨는데 기대하고 있습니다 감사합니다!!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
질문있습니다.
안녕하세요 영한님. 강의를 참고하여 프로젝트를 진행 했는데 문제가 발생해서 질문드립니다. 관리자(admin)가 item 테이블의 데이터 하나를 삭제하려고 할 때 해당 item을 주문한 orderItem이 존재하여 외래키 제약 조건 위반이 발생하여 삭제를 하지 못하는 경우,(제가 의도한 설계는 아닙니다) 어떤 식으로 해결 해나가야 할지 감이 잘 잡히지 않네요. JPA에 외래키 제약 조건이 발생하더라도 강제로 삭제를 진행하는 옵션이 있다면 해당 옵션을 걸어줘야 하는지, 아니면 애초에 설계를 orderItem이 있다면 해당 item은 삭제가 안되게 설계를 해야하는건지 영한님이라면 어떻게 해결하실지 궁금합니다..ㅠㅠ
-
해결됨스프링 프레임워크 핵심 기술
컨테이너에 들어가는 있는 빈은?
언제나 좋은 강의 감사합니다 기선님! 13분 부터의 설명을 잘 이해하지 못해서 ㅠㅠ 이렇게 질문을 남깁니다. Spring AOP 의 경우 클래스를 빈으로 등록할때, AOP를 적용시킨 Proxy bean이 등록된다고 이해하면 되는걸까요? 궁금한점은, AOP 가 적용되지 않은 A 클래스도 Bean 으로 컨테이너에 들어가고 AOP를 적용한 proxy Bean도 컨테이너에 들어가게 되나요? 중복적인 부분이라 불필요한 리소스 낭비가 일어날거같은데 proxy Bean만 컨테이너에 들어가게 되는게 맞을까요?