묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 코드에 sql 로그가 남는 이유
@Service @RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; @Transactional //변경 public Long join(Member member) { validateDuplicateMember(member); //중복 회원 검증 memberRepository.save(member); return member.getId(); } } @Repository @RequiredArgsConstructor public class MemberRepository { private final EntityManager em; public void save(Member member) { em.persist(member); } public Member findOne(Long id) { return em.find(Member.class, id); } } --------------------------------------------------------------------------- // 테스트 코드 @Transactional public class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입() throws Exception { //Given Member member = new Member(); member.setName("kim"); //When Long saveId = memberService.join(member); //Then assertEquals(member, memberRepository.findOne(saveId)); } }회원 도메인 개발 파트의 마지막 강의에 있는 테스트 부분입니다테스트는 성공이고, 테스트 결과 로그에는 member 객체에 대한 select sql이 찍힙니다 그런데 테스트 로그에 왜 select sql이 나오는지 잘 모르겠습니다 제가 이해하고 있는 내용은 이렇습니다//When Long saveId = memberService.join(member);위 코드에서 insert sql 이 생성되지만 내부 트랜잭션이라 커밋하지 않아서 해당 엔티티가 영속성 컨텍스트에만 추가된 상태 //Then assertEquals(member, memberRepository.findOne(saveId));위 코드에선 영속성 컨텍스트의 member를 가져오니 select sql 이 실행되지 않습니다 //When Long saveId = memberService.join(member); //Then assertEquals(member, memberRepository.findOne(saveId));그리고 테스트 코드에서 @Transactional 은 롤백이니 join()의 결과가 롤백됩니다 join() 은 롤백됬으니 테스트 결과 로그에 insert sql 이 나오지 말아야 하고,영속성 컨텍스트의 member를 조회했으니 select sql 도 나오지 말아야 하는 것으로 예상됩니다 하지만 insert sql 은 예상한대로 테스트 결과에 나오지 않는데,select sql 은 나오는 이유를 모르겠습니다 해결했습니다validateDuplicateMember(member) 중복 회원 검증하는 메서드에서 select sql을 호출하고 있었습니다em.persist() 보다 먼저 호출하기 때문에 DB에서 바로 조회해오고 있었습니다이걸 못보다니..
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
프론트 코드 부탁드립니다.
안녕하세요 강사님. 좋은 강의 잘 들었습니다.배포 끝내고 간단한 기능들 추가 해보고 싶은데 프론트엔드 원본 코드 아래 메일로 보내주시면 감사하겠습니다.그럼 즐거운 하루 보내세요😊bellbu@naver.com
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
13강 User Kotlin 변환중
User.kt , BookService 부분에서 오류가 나는데 원인을 못 찾겠네요
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
기억하기 인증 필터(RememberMeAuthenticationFilter) 강의를 듣다가 사소한 궁금증이 생겨 질문드립니다.
안녕하세요.기억하기 인증 필터(RememberMeAuthenticationFilter) 강의를 듣다가 사소한 궁금증이 생겨 질문드립니다. 리멤버미 쿠키를 사용시 쿠키를 바탕으로 인증 정보를 가져오는 로직에서, JSESSIONID 쿠키가 만료되었을 때와 서버가 재시작되었을 때 password가 왜 다르게 불러와지는지 알고 싶습니다. 서버 재시작 시 리멤버미 쿠키로 인증 정보가 복구되지 않는 이유를 조사하던 중에 생긴 의문인데요. 제 생각으로는 쿠키에 인증 정보를 담고 있어서, 서버가 재시작되더라도 쿠키가 만료되지 않는 한 인증 정보를 복구할 수 있을 것 같았거든요. 제가 코드를 따라가서 확인한 부분은..리멤버미 쿠키를 생성할때 맨 마지막 필드로 makeTokenSignature 메서드의 값이 들어가는데 이 값은 String data = username + ":" + tokenExpiryTime + ":" + password + ":" + getKey(); 정보를 조합하여 만들어지는데,여기서 getKey()는 RememberMeConfigurer에서 init할때 rememberMeServices를 커스텀하게 주입하지 않으면RememberMeConfigurer에서 UUID.randomUUID().toString()로 가져오기 때문에 서버가 재시작할때마다 랜덤한 값을 가지고 오더라구요. 그래서 서버가 재시작되더라도 고정된 key값을 사용하기 위해 TokenBasedRememberMeService를 생성하여 아래와 같이 설정하였습니다.이후에 getKey()할때도 key로 test를 가지고 오는것을 확인하였구요. 그러면 이제 key가 고정이기 때문에 서버가 재시작되어도 리멤버미 쿠키를 바탕으로 인증을 진행하여 로그인 없이 세션이 유지될줄 알았는데?!, processAutoLoginCookie 메서드에서 아래 코드에서 exception이 발생합니다.. if (!equals(expectedTokenSignature, actualTokenSignature)) { throw new InvalidCookieException("Cookie contained signature '" + actualTokenSignature + "' but expected '" + expectedTokenSignature + "'"); } 확인해보니 유저 정보를 가져올때 password를 다르게 가져오고있더라구요. TokenSignature는 password와 여러 정보를 조합하여 만드는데, password값이 달라지니 예상값과 실제값이 차이가 나서 exception이 떨어지구요.. UserDetails userDetails = getUserDetailsService().loadUserByUsername(cookieTokens[0]);*로그인 > JSESSIONID 삭제 이후 로그인시*서버 재시작 이후 로그인시 질문이 좀 장황했는데, 왜 password를 다르게 가져오는지 궁금합니다. 코드를 쫓아가다가 길을 잃어서 도움을 받을수 있을까 하여 질문을 남겨요.. 감사합니다.
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
DBeaver 연결부터 도커로프로젝트 빌드까지 안됩니다.
https://github.com/WooXher/kotlin-study-portfolio 백엔드 프로젝트 참여중인 인원입니다 오후부터 강의 들으면서 따라하고 있는데 첫 mysql 연결시는 3306포트가 사용중이라고 하여 3307로 변경하고 실행하였는데 테스크 커넥션에서 비밀번호가 거부되어 연결이 안되어서 넘기고 프로젝트 빌드이후로 시작하고 있는데 디비연결이 안되어서 그런지 데이터가 보이지 않았습니다. 이것저것 수정하다보니 이젠 프로젝트 자체도 연결이 안되고 있는데 어떻게 해야하나요?
-
미해결스프링 배치
Multithread step과 AsyncItemProcessor
read 작업이 무겁고(느림) processor 작업에는 I/O(api call 등,,)가 많다고 가정했을때 Multithread step(reader는 스레드안전)과 AsyncItemProcessor를 함께 사용해도 문제가 없을까요??Multithread step 자체도 별도의 스레드 풀에서 동작하고AsyncItemProcessor도 다른 스레드 풀에서 작동하고reader(reader는 스레드안전)에서 데이터를 가져올때 이미 작업범위가 정해져있기 때문에 동시성으로 부터도 안전해 보여서요!
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
뷰 개발 파일 없음
다운받은 파일에서assets/vendor/quill/quill.min.js.quill.min.js가 존재하지않는데 그냥 진행해도 될까요? fragment-foot<script src="assets/vendor/quill/quill.min.js" th:src="@{/assets/vendor/quill/quill.min.js}"></script>페이지 실행은 잘 되는데 파일이 존재하지않아서 에러가 나옵니다.
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
fragment 분리 에러
타임리프 뭐가 문제일까요? 아무리 찾아봐도 모르겠습니다ㅜ https://github.com/lee-soohyun/portfolio-lee/commit/56f4909c2ceb6c6e5ad1b6dbb9603e0c2233a825
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
writer 와 content 혼란
api 서버에서 Todo 엔티티 에는 content 로 했는데 왜 이번 섹션4 강의부터 갑자기 writer 가 나오는 건가요?원래 writer 인데 content로 잘못 만드신건데 그냥 사용하신건가요? 그냥 계속 진행 해도 별 문제 없는 건지 궁금합니다
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
추스 스키마 질문...
스프링강의 18강 Controller를 3단 분리하기 강의에서 7분 30초쯤에 나오는 추스 스키마? 아무리 찾아도 저는 그런게 없는데 어떻게 하나요? 추스 스키마로 라이브러리 설정이 저는 보이지 않네요 인텔리제이 2024.2.3 울티메이트 사용하고 있습니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
6분 41초 영상 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]해당 영상 6분 41초에서 '사실상 Member에서 Orders의 1대 다가 표현되는 이 컬렉션은 필요가 없다' 라고 말씀해주셨는데 해당 표현에 의미가 1:N 연관 관계가 필요없다는 의미가 아니라 orders속성이 필요없다는 의미가 맞을까요??
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
admin 페이지에서 projectSkill 질문 있습니다
admin 페이지 중 왼쪽에 사이드바에서 projectSkill 클릭할 때 url 이 "/admin/project/skill" 이 아닌, "admin/projectSkill" 로 넘어가져서 오류 페이지로 이동된다면 어디를 고쳐야 할까요? @Controller @RequestMapping("/admin/project/skill") class AdminProjectSkillViewController( private val adminProjectSkillService: AdminProjectSkillService ) { @GetMapping fun projectSkill(model: Model): String { val proejctList = adminProjectSkillService.getProjectList() val skillList = adminProjectSkillService.getSkillList() val formElements = listOf<FormElementDTO>( SelectFormElementDTO("project", 8, proejctList), SelectFormElementDTO("skill", 4, skillList) ) model.addAttribute("formElements", formElements) val table = adminProjectSkillService.getProjectSkillTable() model.addAttribute("table", table) model.addAttribute("detailTable", null) val pageAttributes = mutableMapOf<String, Any>( Pair("menuName", "Projects"), Pair("pageName", table.name), Pair("editable", false), Pair("deletable", true), Pair("hasDetails", false), ) model.addAllAttributes(pageAttributes) return "admin/page-table" } }
-
해결됨실전 jOOQ! Type Safe SQL with Java
FilmWithActor로 fetch 시 select와 생성자의 매개변수 순서가 다를 경우 map이 정상적으로 이루어 지지않는 케이스
안녕하세요 강의를 재밌게 수강하던 도중 궁금증이 생기어 질문 드립니다. 질문select 의 row 매개변수의 순서와 FilmWithActor의 생성자 매개변수의 순서가 각 테이블 타입에 매칭되지 않을 경우 mapping이 정상적으로 이뤄지지 않는 현상이 있어별도의 해결 방법이나 대안이 있는지 여쭙고 싶습니다. 정상 케이스(Film - FilmActor - Actor)dslContext.select( DSL.row(FILM.fields()), DSL.row(FILM_ACTOR.fields()), DSL.row(ACTOR.fields()) ).from(FILM) .join(FILM_ACTOR) .on(FILM.FILM_ID.eq(FILM_ACTOR.FILM_ID)) .join(ACTOR) .on(FILM_ACTOR.ACTOR_ID.eq(ACTOR.ACTOR_ID)) .offset((page - 1) * pageSize) .limit(pageSize) .fetchInto(FilmWithActor.class); public class FilmWithActor { private final Film film; private final FilmActor filmActor; private final Actor actor; public FilmWithActor(Film film, FilmActor filmActor, Actor actor) { this.film = film; this.filmActor = filmActor; this.actor = actor; } // ... 문제 케이스(Film - Actor - FilmActor)dslContext.select( DSL.row(FILM.fields()), DSL.row(FILM_ACTOR.fields()), DSL.row(ACTOR.fields()) ).from(FILM) .join(FILM_ACTOR) .on(FILM.FILM_ID.eq(FILM_ACTOR.FILM_ID)) .join(ACTOR) .on(FILM_ACTOR.ACTOR_ID.eq(ACTOR.ACTOR_ID)) .offset((page - 1) * pageSize) .limit(pageSize) .fetchInto(FilmWithActor.class); public class FilmWithActor { private final Film film; private final FilmActor filmActor; private final Actor actor; public FilmWithActor(Film film, Actor actor, FilmActor filmActor) { this.film = film; this.filmActor = filmActor; this.actor = actor; } // ...
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테이블이 생성이 안됩니다...
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)y2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)y3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)y[질문 내용]여기에 질문 내용을 남겨주세요.H2를 삭제 후 재설치도 해봤지만 여전히 테이블이 생기지않습니다...
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
v5, v6 로 가면서 점점 JPA 를 쓰는 장점이 없어지는 느낌이 들어서요..
JPQL 로 한번에 가져오는 방식으로 변경해가면서 실제 db 로 날아가는 쿼리 횟수는 적어지지만 jpql 에 점점 더 많이 의존하게 되는것 같아요. 전 jpa 가 sql 쿼리 사용의 의존을 줄이고 애플리케이션 단에서 객체지향 적으로 코드를 짤 수 있다는 이유 때문에 사용하는 것으로 알고있는데요.. 물론 orm 만으로 모든 비즈니스 로직을 해결하기엔 힘든 경우도 있다는 것은 잘 이해하고 있지만, JPQL 을 많이 사용할 수록 mybatis 를 사용하는 것과 다를게 없다는 느낌이 드는데.. 현업에서는 n + 1 문제나 쿼리 횟수 최적화를 위해서 jpql 로 많이 작성하는지 궁금해요
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
refresh token filter
refresh token filter를 validation하고재발급해주는 걸 컨트롤러로 구현하셨는데 필터로 구현한다면UsernamePasswordAuthenticationFilter 앞으로 지정한JWTCheckFilter 에다가 구현하면될까요>?
-
미해결GraphQL: REST API를 대체할 기술
Node.js 서버 Docs 불러오기 안됨
선생님 안녕하세요.. Node.js 프로젝트 생성 및 초기설정 따라하고 있는데 문제가 발생하여 글 남깁니다.. 영상 속 코드를 모두 따라친 후 알타이어에 reload Docs를 했는데 Introspection request failed with: 400이러한 에러와 함께 docs가 불러와지지않았습니다. 그래서 수업 노트에 올려주신 코드를 그대로 복붙해 다시 실행해보았는데도 여전히 동작하지 않습니다.. 버전이 많이 바뀌면서 강의속 코드가 동작하지 않는것인지.. 구글링도 해보고 여러 방법을 시도해보았는데도 해결되지 않아 혹시 해결 방법을 알 수 있을까 하여 문의남깁니다 ㅠㅠ
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문상품 양방향
주문상품과 주문은 다대일 양방향인데주문상품과 상품은 다대일 단방향으로 하셨는데첫번째는 양방향으로 설정하신 이유가 뭘까요?
-
미해결실전! 스프링 데이터 JPA
em.persist에 대해서 궁금한 점이 있습니다.
제 기억속에 jpa 활용편에서 들었던 내용이였던 거 같은데em.persist()를 호출하게 되면 id값이 자동증가여서값이 null이기 때문에 em.flush를 호출안해줘도 persist와 동시에 flush가 호출된다고 기억속에 있습니다...혹시 맞을까요..?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
어려워요!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]자바 중급까지 듣고 스프링 입문 강의를 한번 들어봤는데 자바 중급 강의 까지는 이해도 잘 되고 좋았습니다.그런데 이번 스프링 입문 강의 들으니 이해가 쉽지가 않네요스프링 기본 강의로 넘어가면 자바 강의했던거 처럼 차근차근 가르쳐 주시는건가요? 아니면 여기서 이해 안되는 것들 다 알고 넘어가야 하나요?