묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
질문이 있습니다.
private List<OrderItemQueryDto> findOrderItems(Long orderId) { return em.createQuery( "select new jpabook.jpashop.repository.query.OrderItemQueryDto(oi.order.id, i.name, oi.orderPrice, oi.count)" + " from OrderItem oi" + " join oi.item i" + //이걸 왜 하는거지 => 실 객체바꿀라고? " where oi.order.id = :orderId", OrderItemQueryDto.class ).setParameter("orderId", orderId).getResultList(); }위 코드에서 "join oi.item" 하는 이유가 궁금합니다.OrderItem엔 Item이 있으니 i.name 대신 oi.item.name하여도 될 것 같은데 굳이 Item도 조인하는 이유가 있을까요? 제가 생각한 결과로는 Item을 조인하여 i.name할 때 Item이 프록시에서 실 객체로 바뀌니 이것을 위해 조인하였을 것 같은데 맞을까요?
-
미해결스프링 시큐리티
invalidSessionUrl
현재 부트 5.7버전을 사용하면서 SecurityFilterChain을 빈으로 등록하면서 기본 API들을 구현하고 있는데 sessionManagement() 부분에서 invalidSessionUrl 메소드 자체가 없어진거 같은데 5.7 이후부터는 이 메소드를 활용하지 못하는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
dto 설계시 궁금증
위와같이 Form의 필드가 4개라고 했을 때각각을 입력하거나 입력하지 않는 경우 총 2^4 = 16개입니다.그렇다고 하면 dto에 입력 경우의 수에 따른 변경감지 로직을 총 16개 작성해 두어야하는건가요? 어떻게 설게를 해야하는지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
createMember, createItem 메서드
테스트 클레스에createMember, createBook 메서드를 만들었는데이걸 domian에 생성하고기본 생성자를 protect로 만들어놓으면OrderItem에서 했던 방식처럼더 나은 방식인건가요??
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
/orders에서 화이트라벨페이지가 뜹니다..
짧은 지식으로 추측컨데,html파일에 문제가 있는것으로 판단해 몇차례 확인 후 복붙을 시도해보았습니다매핑을 잘못한것인가 컨트롤러도 수차례 확인하였고...혹시 관련된 비지니스로직에서 데이터를 잘못 불러오는것인지,,데이터를 백업해두고,강의 초반에 있는 소스코드를 통해java 부분과 templates을 통채로 복사해보았음에도, 해결이 되지 않습니다.최대한 혼자서 해결하려 했으나... 도저히 해결방안이 떠오르지 않아서 질문드립니다.어째서 이러한 문제가 발생하는것일까요...?ㅜㅜ하단에 구글드라이브 링크 첨부해두었습니다. 도와주세요...ㅠㅠ야생형 코스로 활용 -> 기본 -> 활용 단계로 복습하는 시점이라..(1회차에선 멀쩡히 넘겼던 부분을 2회차때 도저히 못고치는 기현상...... ㅜㅜ)아티펙트, 그룹명이 jpabook2 , jpashop2 로 설정되어 있습니다. 이점 양해 부탁드립니다..https://drive.google.com/file/d/1gY3cQKM2yq8SsObwAMAbk3gKOScsx6Jp/view?usp=sharing
-
미해결[개념은 호옹~, 실습 빡] 스프링 부트, 입문!
인코딩 등등 질문
질문1. html 태그 넣어서http://localhost:8080/hi 에 들어갔는데이렇게 물음표가 떠요. 똑같이 복붙했는데, 왜 그럴까요??구글링해서 인텔리제이 인코딩설정 뜨는 거 모든 방법 다 했는데 계속 똑같이 떠요...ㅠㅠㅠ질문2.여기에 계속 빨간 박스 뜨는 원인 알고 싶습니다..!질문3.템플릿에 처음에 바로 article 폴더 만드니까템플릿 안에 폴더 만들어 지는 게 아니라 템플릿 자체 이름이 tempales.article로 바꼈었어요!그 부분은 왜 그런 걸까요? 그리고 폴더 잘못 만들었을 때 폴더 삭제 방법도 알고 싶습니다!질문4. 처음에 깔 때는 run 버튼이 없어서... 구글링해서 설정을 해줘야 했습니다!run 없이 깔리는 경우는 왜 그런 걸까요..?질문5. 앞부분 greeting, goodbye부분 말고 article부터 따라하면 안 되는 부분인가요? 레이아웃 부분이 없어서 그런가요? article부터 만드는 방법이 혹시 있는지 궁금합니다! :)질문6.이 강의 다 들으면 스프링 부트에 입문! 정도 할 수 있는건가용?스프링 부트를 제대로 다루려면 뭐를 더 배워야 하는가용???넘 질문이 많아서 죄송해요 강의 이해 완전 잘 되고 유익합니다!!!좋은 강의 만들어 주셔서 넘 감사합니다 ㅎㅎ
-
해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
User Entity 생성 관련 질문입니다.
안녕하세요.강의 덕분에 코틀린을 잘 배우고 있는 수강생 입니다.다름이 아니라, 예저 소스에서 User Entity로 DB에 테이블을 생성하고 있는데,제가 별도로 만든 프로젝트에서는 동일하게 User로 Entity 어노테이션을 붙이고 애플리케이션을 시작하면 에러가 발생하길래 에러 내용으로 찾아봤더니, User Entity를 user라는 이름으로 테이블을 생성하려고 하는데, user는 사용할 수 없는 이름이라는 것 같습니다(예약어)예제 소스와 동일하게 설정을 했는데 제가 놓치고 있는 부분이 있는 걸까요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
My Json Editor
호돌맨님 안녕하세요강의 진행중 사용하는 My Json Editor Tool 은 혹시 어디서 다운로드 받을수 있을까요? 안내해주시면 감사하겠습니다 ㅎㅎ
-
미해결스프링 시큐리티
스프링 신버전 : 유저 생성 코드 공유합니다
@Bean public UserDetailsManager users() { UserDetails user = User.builder() .username("user") .password("{noop}1111") .roles("USER") .build(); UserDetails sys = User.builder() .username("sys") .password("{noop}1111") .roles("SYS") .build(); UserDetails admin = User.builder() .username("admin") .password("{noop}1111") .roles("ADMIN", "SYS", "USER") .build(); return new InMemoryUserDetailsManager( user, sys, admin ); }
-
해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
멀티 모듈에 대한 질문이 있습니다!!
안녕하세요 !! 자바 개발자가 되기 위해 학습하다가 코틀린을 새로 배우는 과정에서 이 강의를 듣게 된 학생입니다!!먼저 좋은 강의 제공해주셔서 정말 감사합니다!!멀티 모듈에서 Repository를 각각 api 모듈에 맞게 구현하고, Spring Data JPA Repository를 코어 모듈에 둔다고 하셨는데. 이런 경우에는 api 모듈에서 core와 관련된 그래들 설정(Querydsl or db 등)이 들어가겠구나 라는 생각이 들었습니다. 멀티 모듈의 장점 중 하나가 모듈의 역할에 맞게 의존성을 관리하는 것도 있다고 생각하는데, 이런 경우 이 장점을 잃지는 않을까 우려됩니다.그래서 저는 멀티모듈을 사용할 때, core 모듈에 Repository와 관련한 코드를 놓고, 사용하는 모듈에서 인터페이스, 혹은 Repository를 참조하는 구현체를 만들어 해당 클래스만 사용하게끔 유지하는 게 좋지 않을까 생각하는 편인데요. 혹시 강사님의 의견은 어떠신지 궁금합니다!!(적고 보니 강의 내용과는 조금 다른 질문인 것 같아 조금 죄송스럽네요 ㅠㅠ)
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
assertThat, assertXXXX
영한님 영상을 보면 어떤 때는 assertThat을 사용하시고 어떤 때는 assertTrue를 사용하시더라구요.궁금해서 인터넷에 검색을 해봤는데 "asserThat으로 사용하는 게 좋지않을까?" 라는 글이 몇개 있더라구요.질문 : 테스트작성을 앞으로 해야할때 Junit4와 junit5중 어느 것으로 작성을 연습하는게 좋을까요?assertXXXX와 assertThat 어느 것을 선호하시나요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
else 사용
강의하는 영상보며 항상 배우고 있습니다.요즘 알고리즘 문제도 공부하면서 항상 고민인 부분인데요.if-else문에서 else를 써야하는가 입니다.강의7:16초에서 영한님은 else를 사용하지 않으시더라구요.그래서 궁금해서 웹에 검색을 하니 camelcase급으로 표준화된 방식이다. 아니다 케이스 바이 케이스다. eslint라는 곳에서는 if 다음에 return이 있으면 else쓰지마라 라고도 하더라구요.질문 : 현업에서는 else를 지양하는 편인가요?
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
테스트 컨텍스트에 대한 질문입니다.
안녕하세요. 강의를 듣던중 테스트와 관련해서 한가지 궁금한 점이 있어서 질문 남깁니다.일단 저는 현업에서 @SpringBootTest 를 사용하지 않고 서비스 계층은 목킹을 해서 별도의 스프링 컨텍스트를 사용하지 않고 테스트를 하고 있습니다. 문제는 컨트롤러 계층을 테스트 할 때인데요. @WebMvcTest 로 테스트를 할 때 하나의 컨트롤러를 테스트 할때는 상관이 없지만 통합테스트 형태로 모든 테스트를 실행시에는 @WebMvcTest 가 각각 달린 컨트롤러 테스트마다 별도의 스프링 컨텍스트가 뜨기 때문에 테스트가 느려지는데요. (모든 컨트롤러 테스트가 같은 빈 조합을 사용한다면 같은 컨텍스트를 사용하겠지만 그런 경우는 거의 없기 때문에 각각의 테스트 클래스마다 대부분 스프링 컨텍스트가 새로 뜨는거 같습니다.)그래서 하나의 추상 컨트롤러 테스트에만 @WebMvcTest 를 달고 여기에 모든 테스트 대상 컨트롤러를 다 추가하고 이 추상 클래스를 상속받아 각각의 테스트 클래스를 사용하고 있습니다. 그래서 전체 테스트 시에는 테스트 속도가 빠라졌지만, 이렇게 하다보니 하나의 컨트롤러 테스트를 할 때도 상속받은 추상클래스에 있는 모든 테스트 컨트롤러가 다 임포트 되어 하나의 컨트롤러 테스트가 너무 느려졌고, 단위 테스트의 의미가 사라지는거 같습니다. 혹시 이와 관련해서 좋은 방법이 없을까 해서 질문을 남깁니다. 그리고 @SpringBootTest 시에는 각각의 테스트 말고 전체를 테스트 할 때 @WebMvcTest 를 할 때처럼 스프링 컨텍스트가 여러개 떠서 테스트 속도가 느려지는 문제가 없을까요? 항상 @SpringBootTest 는 무겁다는 생각 때문에 잘 사용을 안해서 궁금하네요. 그리고 현업에서 @SpringBootTest 를 자주 사용하는지도 궁금합니다. 저는 주로 @WebMvcTest, @DataJpaTest 이정도를 사용하고 도메인 계층은 일반 클래스 처럼, 서비스 계층은 모킹만 해서 스프링 도움없이 테스트를 하고 있습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberForm을 사용하는 이유가 무엇인가요?
@GetMapping("/members/new") public String createForm(Model model){ model.addAttribute("memberForm", new MemberForm()); return "members/createMemberForm"; }model.addAttribute를 사용하지 않고 일단 createMemberForm.html로 간 뒤에 form post로 데이터를 넘기면@PostMapping("/members/new") 컨트롤러가 비즈니스로직을 수행하면 되는 것 아닌가요? createMemberForm이라는 html에 new MemberForm()으로 객체를 넘길 수 있는 내부적인 원리가 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 인메모리 데이터베이스 눈으로 확인
강의를 들으면서 h2 인메모리 기능을 보고 매우 좋은 기능이라고 생각이 들었습니다.한편 "인메모리 h2 데이터베이스도 @Test를 이용해 삽입한 데이터를 눈으로 확인할 수 있을까?"에 대한 궁금증이 남더라구요.궁금해서 테스트해보았는데 데이터가 남지 않더라구요. 1. main의 application.yml에서 h2를 인 메모리로 바꾸고 서버를 실행하였습니다. (서버를 메모리상에서 계속 실행시켜두고 싶었습니다.)2. http://localhost:8080/h2-console에 들어가보니 테이블이 정상적으로 생성된걸 확인할 수 있었습니다.3.test의 application.yml애서 h2를 인메모리로 바꾸었습니다.->test의 application.yml의 ddl-auto를 none으로 하니 main에서 스프링을 실행시켜 서버를 구동하고 테이블을 만들었음에도 불구하고 Test는 서버를 찾지 못한다. 즉 main의 인메모리 서버와 Test의 인메모리 서버는 application.yml에서 이름을 동일하게 했음에도 작동을 안하는것을 보면 Test의 h2(인메모리)와 main의 h2(인메모리)는 독자적으로 작동한다.4.Test의 회원가입을 ROLLBACK을 false로 바꾸고 실행해 보았습니다. (이때 서버가 인메모리가 아닌 경우,즉 일반 TCP h2 서버에는 데이터가 테스트이후에도 남아있었습니다.)(Test의 ddl-auto는 create)->main(실제어플리케이션)와 @Test의 h2인메모리는 서로 다르기 때문에 ddl-auto값이 none이였으면 실패했을것이고 create이기때문에 테이블을 만들 수 있어 테스트가 실패하지않고 진행되었다.5.확인해보니 h2 인메모리 서버에는 데이터가 남아있지 않았습니다.->h2인메모리는 @Test와 main(실제어플리케이션)에서 각자 독자적으로 실행되기때문에 남지않는다.->h2를 인메모리로 할 경우 Test가 끝나면 삽입했던 데이터를 메모리에서 삭제해버리기때문에 ROLLBACK을 false로 해도 인메모리 h2 서버에는 데이터가 남지 않는다.즉 tcp h2서버를 사용할때 @Test에서 rollback을 false로 해두면 데이터베이스에 데이터가 삽입된걸 눈으로 확인 할 수 있지만 @Test에서는 애초에 main과 다른 h2인메모리를 사용하고 테스트가끝나면 @Test의 인메모리h2를 삭제해버리기 때문에 눈으로 확인할 수 없다라고 이해를 했는데 옳바른 이해일까요?한편으로 데이터가 데이터베이스에 삽입 삭제하는걸 눈으로 확인 하고 싶을 것 같은데 h2데이터 베이스를 인메모리로 두면 확인이 안될것 같아서 불안할 것 같더라구요. 만약 현업에서 테스트를 한다면 인메모리보다는 아예 개발DB를 두고 테스트를 하기때문에 이러한 고민은 안해도 되는게 맞는거겠죠?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원가입 테스트 오류 발생 문의
안녕하세요,테스트 진행 중 오류가 발생하여 문의드립니다.회원가입을 테스트할 때 @Transactional을 주석처리하면 정상 작동되지만, 활성화하면 오류가 발생합니다.java.sql.SQLException: Connection is closed이것은 JdbcMemberRepository의 sava() 작성 내용입니다.@Transactional을 활성화하면 오류가 발생하는 원인과 해결 방법이 궁금합니다..!!
-
미해결실전! 스프링 데이터 JPA
아래 질문 글 Yong.K 님의 질문의 답변에 관한 질문글 입니다 - flush관련
아래 질문글 Yong.K 님의 글에 대한 답변으로 ,JPQL이 실행되기 전 flush가 되지만이때 flush는 em.flush() 처럼 영속성 컨텍스트를 완전히 flush 시키는 것이 아니라 ,실행될 JPQL과 관련된 엔티티만 부분적으로 fluish 시키는 것이라고 설명해주셨습니다.하지만 이렇게 부분적으로만 flush 시킨다면 ,벌크연산 후 clearAutomatically에 의해 영속성 컨텍스트가 비워져 버리면 문제가 생길 수 있어,벌크연산의 옵션으로 flushAutomatically가 있고 - 이 옵션을 활성화 시키면 em.flush()를 호출한 것 처럼 완전히 flush 되는것으로 이해하였습니다. 그렇다면 벌크연산 사용시 flushAutomatically 옵션을 비활성화 시키고 - clearAutomatically 옵션만을 활성화 시킨다면 여전히 문제가 발생할 여지는 남아있는 것이 맞는지 궁금합니다.즉 그렇다면 결과적으로 clearAutomatically 옵션만 활성화 시키는게 아니라 , flushAutomatically 옵션도 함께 활성화시켜야 하는것은 아닌지 궁금합니다.
-
해결됨Spring Boot JWT Tutorial
java: package io.jsonwebtoken.io does not exist 에러 관련
강의 잘 듣고 있습니다 감사합니다!혹시스프링 2.7.3 사용, 자바 11 사용 중인데java: package io.jsonwebtoken.io does not existimport io.jsonwebtoken.*; import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys;요 3개를 import 하지 못합니다...java: package io.jsonwebtoken.io does not exist오류가 뜹니다... 바쁘신데 죄송합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
다수의 개발자가 같이 협업할 때에 궁금한 점이 있습니다.
안녕하세요!먼저 강의 너무너무 잘 보고 있습니다!공부를 하다가 갑자기 궁금한게 생겼는데,여러 개발자와 협업해야하는 환경이 될 때같은 서비스를 개발 할 시 개발 환경이 어찌 되는지 알고 싶습니다.Q1. 같은 서비스 개발 할 때에 디스커버리 서버와 APIGateway를 각자 개발자가 켜놓고 연관 된 서비스들도 다 실행 한 뒤에 개발을 하는지..Q2. 아니라면 APIGateway를 공용으로 사용시 따로 환경세팅이 있을까요?APIGateway를 공유하고 같은 서비스를 켜놓고 개발을 진행시 프론트에서 서비스 API등 호출 할 때에 제가 아닌 다른분의 서비스에 들어가면 어쩌지? 하는의문에서 시작되었습니다.너무너무 궁금합니다..강의는 너무 잘 보고 있고 다음강의도 기대하겠습니다!감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
DTO를 이용해서 변경감지를 이런 식으로 하는지 검토 부탁드려요!
안녕하세요, 강의에는 나오지 않았지만 변경감지를 병합보다 추천하셔서 DTO를 사용해서 한 번 짜보았는데 봐주실 수 있나요? ```java package jpabook.jpashop.service;import lombok.Getter;import lombok.Setter;@Getter @Setterpublic class UpdateItemDto { private Long id; private String name; private int price; private int stockQuantity; private String author; private String isbn;}```일단 UpdateItemDto는 간단히 Getter, Setter만으로 구성했습니다. @PostMapping("items/{itemId}/edit")public String updateItem(@PathVariable("itemId") Long itemId, @ModelAttribute("form") BookForm form) { UpdateItemDto updateItemDto = new UpdateItemDto(); updateItemDto.setId(form.getId()); updateItemDto.setName(form.getName()); updateItemDto.setPrice(form.getPrice()); updateItemDto.setStockQuantity(form.getStockQuantity()); updateItemDto.setAuthor(form.getAuthor()); updateItemDto.setIsbn(form.getIsbn()); itemService.updateItem(itemId, updateItemDto); return "redirect:/items";}위 코드는 ItemController 안의 updateItem 메소드입니다.@Transactionalpublic void updateItem(Long itemId, UpdateItemDto updateItemDto) { Item findItem = itemRepository.findOne(itemId); //findItem으로 찾아온 값은 영속상태 findItem.change(updateItemDto);}위 코드는 ItemService 클래스의 updateItem 메소드입니다. public void change(UpdateItemDto updateItemDto) {// if (updateItemDto.getId() != null) {// this.id = updateItemDto.getId();// } if (updateItemDto.getName().length() != 0) { this.name = updateItemDto.getName(); }// if (updateItemDto.getPrice() != null) {// this.price = updateItemDto.getPrice();// }// if (updateItemDto.getStockQuantity() != null) {// this.stockQuantity = updateItemDto.getStockQuantity();// } this.price = updateItemDto.getPrice(); this.stockQuantity = updateItemDto.getStockQuantity();// if (updateItemDto.getAuthor() != null) {// this.author = updateItemDto.getAuthor();// }// if (updateItemDto.getIsbn() != null) {// this.isbn = updateItemDto.getIsbn();// } }마지막으로 Item 클래스의 change 메소드입니다.Book의 상위 클래스이기 때문에 author과 isbn 필드가 없어서 이 change 메소드를 Book 클래스 내로 옮겨야 하는지 고민을 했습니다.그러나 그렇게 진행하면 부수적인 문제가 너무 많이 생겨 그냥 Item 클래스 내에 남기고 author와 isbn을 수정하는 기능은 없앴습니다.id는 바꿀 필요가 없다고 생각하여 기능을 뺐습니다. Form에도 id를 수정하는 란은 없는데기존에 영한 님이 강의하실 때 ItemController 내에서 book.setId(form.getId)); 하셨는데 잘못된 부분인 것 같습니다.name같은 경우 String이라 웹 상에서 수정을 할 때 빈 칸으로 두면 null보다 empty string으로 받는 것 같아서updateItemDto.getName() != null 조건에 안 걸리는 것 같더라구요. 그래서 빈 칸을 empty string을 찾는 식으로짰습니다. 마지막으로 price와 stockQuantity는 int라서 != null 조건을 걸수가없는데웹 상에서 빈 칸일 때 이전 price와 stockQuantity를 유지하는 방법을 여쭤보고 싶습니다.결론적으로 제 질문은:1. UpdateItemDto의 경우 controller 패키지의 BookForm과 이름 외에 똑같은데 그래도 DTO 클래스를 따로 만드는데 의의가 있는건가요?2. ItemController 내에서 어설프게 Entity를 생성하지 말라고 하셨는데 DTO 객체를 생성하는 것은 괜찮은가요?3. 전반적으로 이런 방식으로 변경감지를 하는건지가 궁금합니다.4. change 메소드를 Item 밑에 두는게 맞는지 Book 밑에 두는게 맞는지?답변 주시면 정말 큰 도움이 될 것 같습니다.감사합니다!