묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
H2 테이블 생성 안됌
1. 강의 내용과 관련된 질문인가요?네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? 네프로젝트 파일https://drive.google.com/file/d/1CzJgYLZqQ724aJMnYqODWUG6MK9h1K72/view?usp=sharing로그에 테이블 생성 쿼리와 insert 쿼리까지 나갔는데도 불구하고 h2 데이터 베이스에 테이블이 보이지 않습니다.[질문 내용]여기에 질문 내용을 남겨주세요.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
질문있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의에서 나오는 예제에서는 Item 테이블을 두고, 하위 테이블인 Album, Book, Movie 테이블을 생성하여 상속하는 구조로 하고 있는데요. 실무에서는 상품 종류가 한두가지가 아니라 수백개, 수천개가 될텐데 그러면 이러한 테이블을 전부 만드나요? 예를 들면, 쿠팡 같은 쇼핑몰에서는 음식 뿐만 아니라 컴퓨터, 마우스,모니터, 커피, 프로틴, 과일, 연필, 물 등등 상품 종류가 어마어마하게 많은데 이를 어떻게 관리하는지 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
fetch join이 명시적 inner join과 다른 이점이 뭔가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용](Hibernate6버전 쓰고 있습니다.)1. 페치 조인 JPQLselect t from Team t join fetch t.members2. 명시적 내부 조인 JPQLselect t,m from Team t inner join t.members m위 JPQL을 실행하면 같은 SQL 쿼리가 실행됩니다.fetch join이 명시적 inner join과 다른 이점이 뭔가요?fetch join을 썼을 때, List<Team>으로 결과를 받고 중복없이 Team에 속한 members 리스트가 조회됐습니다.예를 들면, 팀A-> 회원1-> 회원2inner join을 썼을 때, List<Object[]>로 결과를 받고 Team과 Member가 쌍을 이뤄서 조회됐습니다.SQL 조회결과처럼 Team이 중복되어 출력됐습니다.팀 A, 회원1팀 A, 회원2팀이 중복되지 않고 한번만 출력된다.Object[] 타입으로 안다뤄도 되니 결과를 처리할 때 편하다.이 외에 다른 이점이 있나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
.setFirstResult(1) 부터 하는 이유?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]0으로 하셨다가 1로 변경하신 이유가 이해가 안 됩니다 ㅠㅠ
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
itemService 테스트 코드 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]ItemService 테스트 코드입니다.@RunWith(SpringRunner.class) @SpringBootTest @Transactional public class ItemServiceTest { @Autowired ItemRepository itemRepository; @Autowired ItemService itemService; @Test public void 상품저장() throws Exception { //given Item item = getItem("JPA book", 10000, 100); itemService.save(item); //when Item findItem = itemService.findById(item.getId()); //then // assertThat(item).isEqualTo(findItem); assertEquals(item, findItem); } @Test public void 상품조회() throws Exception { //given Item item1 = getItem("JPA book1", 10000, 100); Item item2 = getItem("JPA book2", 20000, 100); itemService.save(item1); itemService.save(item2); //when List<Item> findAll = itemService.findAll(); Item findItem1 = itemService.findById(item1.getId()); //then assertThat(findAll.size()).isEqualTo(2); //전체조회 assertThat(item1).isEqualTo(findItem1); //단건조회 } @Test public void 상품변경() throws Exception { //given //when //then } private static Item getItem(String name, int price, int stockQuantity) { Item item = new Book(); item.setName(name); item.setPrice(price); item.setStockQuantity(stockQuantity); return item; } }상품 저장과 조회에 대한 테스트 코드를 작성해보았는데 혹시 수정해야 할 부분이 있는지 궁금합니다.상품 저장 시 item.getId() == null 이 아닐 때 merge 하도록 되어있는 부분에 대해서도 테스트를 해야할 것 같은데, 어떻게 테스트할지에 대해 방향성을 알려주시면 감사하겠습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
쓰기 지연 저장소
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]sql 쓰기 지연 저장소에 쿼리가 저장되는 타이밍이 헷갈립니다 em.find() 이후 member.setXXX 같은 경우는 트랜잭션 커밋 호출 -> 플러시 호출 -> 스냅샷, 1차 캐시 비교 -> 다르면 쓰지 지연 저장소에 쿼리 생성해서 저장 em.remove는 수정과 동일하게 동작 Member 객체 생성해서 em.persist(memberNew) 같은 경우에는 persist 하는 순간 1차 캐시, 스냅샷 저장 + 쓰기 지연 저장소에 쿼리도 생성해서 저장 해당 순서가 맞을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 오류 질문
회원 기능 테스트에서 계속 막혀서 전부 다 복붙하고 해봐도 오류가 납니다 이거 왜이런걸까요? 우선 프로젝트 전체 구글 드라이브에 공유해뒀습니다.https://drive.google.com/file/d/1jEOFgnIZ2fRBWTDKmYaA3lnrid-0i10E/view?usp=drive_link
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
이런 코드 유형?은 어디편에서 공부해야하나요?
public class GuestBookMapper { public static GuestBookDTO toDTO(GuestBook entity) { return GuestBookDTO.builder() .guestBookId(entity.getGuestBookId()) .content(entity.getContent()) .nickName(entity.getNickName()) .reportedCount(entity.getReportedCount()) .createDate(entity.getCreateDate()) .pw(entity.getPw()) .build(); } public static GuestBook toEntity(GuestBookRequest dto) { return GuestBook.builder() .content(dto.getContent()) .nickName(dto.getNickName()) .createDate(LocalDateTime.now()) .reportedCount(0) .pw(dto.getPw()) .build(); } } 프로젝트 진행중 다른분 코드를 공부하다가 Mapper이란 클래스는 왜있고 builder는 뭔지 이런 클래스가 왜있는지 공부하고싶은데 이런 코드유형을 알려주는 인강편이있나요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
시작도 하기 전에 계속 오류가 납니다.
자바 11버전을 깔았는데 계속 자바 1.8버전으로 뜨네요... 그래서 다시 11버전으로 바꿔서 실행을 해보았더니이런 에러가 뜹니다.. 해결방법이 있을까요ㅠ
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
java17 gradle에서 Jwts.builder().signWith()에서 ClassNotFoundError: javax/xml/bind/DatatypeConverter가 발생한다면
javax를 사용하지 못하여 발생하는 문제입니다.implementation 'javax.xml.bind:jaxb-api:2.3.0 <- 이 디펜던시를 추가해주시면 에러는 사라집니다.수업 내용대로 진행했어야 하는데 그렇게 안하니까 여러 에러들이 막 발생하네요ㅠㅠ
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
강의 <상속관계 매핑>에서 h2 데이터베이스
안녕하세요<상속관계 매핑> 강의에서 강사님 화면과 다른 부분이 생겨 질문 드립니다. 먼저 Item 테이블입니다. JOINED 전략 사용했습니다.그 다음 Album, Book, Movie 클래스 입니다. JpaMain 입니다.그런데 실행하고 나니까 강사님 화면과 같이이렇게 나오지 않고,이런 식으로 나옵니다... 똑같이 타이핑 했는데 왜 이렇게 나오는지 궁금합니다. 감사합니다ㅠㅠ
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
service끼리 의존성 주입
안녕하세요 제목 그대로 궁금한 점 있는데, 예를 들어 a라는 service가 b와 c라는 service를 주입 받는 상태이고 여기서 c는 또 d라는 service를 주입 받는 구조가 있다면 이건 정상적인 부분일까요? service가 service를 주입 받는 것이 괜찮은지, 괜찮다면 그것의 depth가 늘어나서 a <- b, c <- d 이런식이 돼도 괜찮은지 궁금합니다!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
REST API로 개발하면
프론트딴에서 어떻게 데이터를 쓰는건가요? 원래 실습할떄 @Controller 어노테이션이면 모델에 담아서 뷰에 전송하고 타임리프로 사용하는건데 REST API는 어떻게 화면에 데이터를 보여지고 진행되는지 궁금합니다.. 그리고 이렇게 개발하면 백앤드에서 기능 구현하고 그 다음에 프론트개발자들이 작업하는건가요? 아니면 프론트가 먼저 개발하고 그 다음에 백앤드가 구현하는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 오류 질문
ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@33a71d23 testClass = jpabook.jpashop.service.MemberServiceTest, locations = [], classes = [jpabook.jpashop.JpashopApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@55dfcc6, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@25bfcafd, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@eda25e5, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@2d96543c, org.springframework.boot.test.context.SpringBootTestAnnotation@8b5a38a4], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@33a71d23 testClass = jpabook.jpashop.service.MemberServiceTest, locations = [], classes = [jpabook.jpashop.JpashopApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@55dfcc6, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@25bfcafd, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@eda25e5, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@2d96543c, org.springframework.boot.test.context.SpringBootTestAnnotation@8b5a38a4], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:145) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:191) at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:130) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)계속 오류나서 Memberservice MemberRepository 랑 test 다 코드 복붙했는데도 오류요
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
파라미터 정의에 대한 질문
안녕하세요 우선 저는파라미터는 메소드의 매개변수로 넘겨지는 값을 의미한다고 알고 있습니다그리고 api 개발에서 보통 파라미터를 dto로 넘긴다고 알고 있습니다. 근데 실무에서 파라미터라고 하면 대게 요청, 응답값만 이용되고 개발자들끼리 파라미터 뭐로 설정했냐 등 얘기가 나올때의 파라미터로는 필수값을 의미한다 라고 얘기를 들었습니다. 그러니까 선택적으로 넘기는 경우도 있겠고, 메소드 내부에서 다른 메소드로 넘기는 파라미터도 있겠지만다른 개발자랑 대화하는 과정에서 파라미터 뭐로 설정했냐 등 얘기가 나오게 될 경우 요청 중 필수값(not null)에 대한 얘기인거다.선택값도 있겠지만 보통 파라미터로 선택값이 넘어가는 경우는 많지 않다메소드 내에서 넘겨지는 값은 어차피 나 혼자 확인하는거라 다른 개발자한테 말할 필요가 없다 라고 말 해주셨는데 진짜 인가요?그러니까 이론 상의 파라미터 정의와실무에서의 파라미터 정의가 다른 것 같다고 하더라고요.. 저는 강의를 보고 controller 에서 dto를 파라미터로 넘기고, 그 dto에는 설계에 따라 다르겠지만 필수, 선택값들이 혼용된 채 사용 될 수 있다고 이해했는데실무에서는 파라미터의 정의가 다르게 사용되고 있는건지 궁금합니다..
-
미해결Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트
2부 마지막 리팩토링 3:30쯤
2부 마지막 리팩토링 0:49에서, "service인데 controller.port를 잘못 참조했다"라고 하셨는데요.이를 수정하고 나신 후인 3:30쯤에서도, 여전히service(의 UserServiceImpl)가 controller(의 Port의 UserService)에 의존하는 상황이지 않나요?제 생각엔 Port 자체를 controller 밖으로 꺼내는 게 의미상 더 좋지 않을까 싶은데 어떻게 생각하시나요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
User Service - 프로젝트 생성 강의 듣고 있는데요.
User Service - 프로젝트 생성 강의 듣고 있는데요.저는 yml에서 아래처럼 주었는데요.server: prot: 8761http://localhost:8761/eureka/ 뜨다가 포트는 8080으로 시작한다는 메세지가 조회되는데요. 컴퓨터 내부에서 포트를 8761쓰다가 자동으로 8080으로 바꿨다는 얘기인가요?2024-07-17T18:27:14.441+09:00 INFO 11100 --- [discover] [ main] c.n.eureka.cluster.PeerEurekaNodes : Adding new peer nodes [http://localhost:8761/eureka/]2024-07-17T18:27:06.225+09:00 INFO 11100 --- [discover] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path ''2024-07-17T18:52:42.764+09:00 INFO 10484 --- [discover] [ main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 80802024-07-17T18:52:43.848+09:00 INFO 10484 --- [discover] [ main] c.e.d.DiscoveryApplication : Started DiscoveryApplication in 13.147 seconds (process running for 16.512)
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 매핑시 양쪽에 값을 넣어야 하는 이유?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의 내용을 보면, 연관관계의 주인에 값을 입력해야 한다고 하셨습니다. 그런데 그 뒤로는 항상 양쪽다 값을 입력해야 한다고 하시는데, 어느 말이 맞는지 혼동이 옵니다.Team team=new Team(); team.setName("TeamA"); em.persist(team); Member member=new Member(); member.setUsername("member1"); member.setTeam(team); em.persist(member); em.flush(); em.clear(); Team findTeam=em.find(Team.class,team.getId()); List<Member> members=findTeam.getMembers(); for(Member m:members){ System.out.println(m.getUsername()); } tx.commit();에서 연관관계의 주인에 team을 설정하였습니다. FK로 연결되어 있기 때문에 team.getMembers().add(member)을 하지 않아도 for문에서 정상적으로 데이터가 조회됩니다. 그런데 flush와 clear를 제거하면 데이터가 조회되지 않습니다. 영속성 컨텍스트에 저장될 때도 generateValue가 발동되어 id값이 생성되어 저장되는걸로 아는데, 왜 빈 객체로 저장된다고 하시는건지 잘 이해가 가지 않습니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
JPQL은 타입안정성을 보장하나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]JPQL은 타입 안정성을 보장하나요?컴파일 시점에 오류라는 것이 코드를 작성할 때, 빨간 줄이 생기며 오류메시지가 나오는 걸로 알고 있는데요.JPQL은 문자열로 쿼리를 작성하기 때문에 컴파일 시점에서 오류를 알 수 없다고 생각했는데요. 강의를 따라가다보니 컴파일 시점에서 오류를 알 수 있는 것 같아서 헷갈립니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
update 메서드의 매개변수 작성 스타일?
// a. public void update( String password, String nickname) { this.password = password; this.nickname = nickname; } // b. public void update(UpdateContent content) { this.password = content.getPassword; this.nickname = content.getNickname; }안녕하세요 update 방식에 대해 궁금한점이 생겼는데, Member 엔터티 클래스 내부에 위와 같이 update 메서드를 둔다고 했을 때, 매개변수의 개수가 많다고 가정하면, 별도의 클래스를 만들어서 b.처럼 전송해주는 방식을 사용해도 괜찮을까요? 엔터티 클래스와 별도의 클래스가 결합?되는 느낌이라 찝찝한데, a.와 b.중 좀 더 정석적인 방식이 있는지 궁금합니다!