묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
8:30 에 윈도우 버전으로 어떻게 바로 템플릿위치로 넘어가나요?
8:30 에 윈도우 버전으로 어떻게 바로 템플릿위치로 넘어가나요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 영한님 질문이있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 아니요2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요 강의잘보고있습니다 다름이 아니라 제가 취업준비하려는 회사가 jsp를 사용하는데 jpa활용2편 까지의 기능을 타임리프 대신 jsp로 적용하여 구현할수있는지 궁금합니다 구현하려면 코드수정이 컨트롤러 에서도 일어나야하는지 궁금합니다!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원가입 동시성 문제
안녕하세요. 강의를 보다가 질문 드립니다. 회원가입 중복처리 부분에서, 김영한님 말대로 회원가입하는 사람수가 매우 많으면 validateDuplicateMember만으론 부족하여, 결국 동시성문제가 발생 할 수밖에 없습니다. 그래서 name에 대하여 unique제약조건이 필수인데요. 그런데 생각해보면 그럴거면 굳이 validateDuplicateMember를 할 필요없이 그냥 unique제약조건을 걸어놓기만 해도 충분합니다. 제가 보기에는 에러처리를 괜히 두번해주는 느낌을 받았거든요. 여기서 이렇게 해주는 이유는 1. 단순 예시를 보여주기 위함. 2. 도메인에 unique제약 조건을 거는 것만으론 테스트를 통과하지 못함(@Commit을 추가하지 않는 이상). 이부분이 테스트 할때 좀 거슬리긴 하더라구요. 3. 좀 더 빠른 반응성? 4. db쪽 예외는 나중에 앞단에서 처리해주기 까다로움. 5. 그 외 다른 이유가 있음. 이정도 생각해보았는데요. 어떤 이유에서 인지 알려주시면 감사하겠습니다.
-
해결됨스프링 부트 개념과 활용
MongoDB slice test
학습하시는 분들이 혹여나 오류가 있을까봐 게시판에 남겨놓습니다.spring boot 2.6버전 이상 쓰시는 분들은 테스트 코드가 오류가 날수 있습니다. Caused by: java.lang.IllegalStateException: Set the spring.mongodb.embedded.version property or define your own MongodConfig bean to use embedded MongoDB at org.springframework.util.Assert.state(Assert.java:76) at org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration.determineVersion(EmbeddedMongoAutoConfiguration.java:148) at org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration.embeddedMongoConfiguration(EmbeddedMongoAutoConfiguration.java:128) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ... 159 more 해결책을 찾아보니 다음과 같이 해결해줄수 있었습니다. @DataMongoTest@TestPropertySource(properties = "spring.mongodb.embedded.version=3.5.5")@ActiveProfiles("test") spring boot 2.6이상버전 부터는 spring.mongodb.embedded.version은 자동 구성된 임베디드 MongoDB를 사용하도록 설정해야하는것 같습니다.참고: https://stackoverflow.com/questions/70047380/excluding-embededmongoautoconfiguration-failed-in-spring-boot-2-6-0https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.6-Release-Notes#embedded-mongo혹시 에러때문에 실패하시는분들이 있으시면 참고하시면 좋을것 같습니다.그리고 교안도 수정해주신다면 감사하겠습니다.항상 좋은강의 만들어주셔서 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
setter 제거에 관한 질문
선생님 언제나 좋은강의 감사드립니다! 선생님께서는 실무에서 왠만하면 셋터를 전부 제거 하신다고 알려주셨는데요. Book 클래스에서 Setter를 제거하려고 시도하다가 나온 의문점이 있어 질문드립니다. 밑의 코드와 같이 작성하였는데요.이 경우 author와 isbn필드로 인해 어쩔수없이 private setter를 두개 둘수밖에없었습니다. 이와같이 private setter를 두는것이 옳을지, 필드를 static으로 바꾸는게 좋을지에 대한 질문인데요 Book 객체의 경우 필드가 두개밖에 없어서 static으로 바꿔줘도 상관없을거라고 생각은하는데 실무에서는 무수히 많은 필드가 있는 객체가 있을경우 static 필드 vs private 셋터중 어떤게 옳은 방법인지 궁금해서 질문드립니다. @Entity@DiscriminatorValue("B")@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)public class Book extends Item { @Setter(value = AccessLevel.PRIVATE) private String author; @Setter(value = AccessLevel.PRIVATE) // static으로 만드는것을 고려? private String isbn; public static Book createNewBook(String author, String isbn, String name, int price, int quantity) { Book book = new Book(); book.setAuthor(author); book.setIsbn(isbn); book.setName(name); book.setPrice(price); book.setStockQuantity(quantity); return book; }}
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
변경감지로 코드를 변경할 때
지금 예제에서는 Book만 수정을 하니 만약에 Book만 가지고 있는 멤버인 ISBN과 작가를 수정하려면 이렇게 케스팅 해주는 방법밖에 없을까요? updateItem 메소드 하나로 item을 상속 받는 구현체들인 Book, Album, Movie를 업데이트 하는 방법이 있는지 궁금하고 혹은 있더라도 그것 보다는 각각을 따로 Dto를 만들어서 updateBook 이런식으로 하는게 더 좋나요? 저는 일단 다운캐스팅으로 Dto 따로 안만들고 했습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Category테이블 관련 질문이요
Category테이블 구현 테스트를 해보려고 하는데요 public class Category { @Id private Long id; private String name; @ManyToOne @JoinColumn(name="PARENT_ID") private Category parent; } Category 저장테스트 해보려고하는데 parent의 동작이 어떻게 되는지 이해가 되지 않습니다.
-
미해결스프링 배치
DuplicateKeyException이 발생합니다.
한번 실행하고 나서 두번째 시도시 아래와 같이 키중복 발생합니다. org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT into BATCH_STEP_EXECUTION(STEP_EXECUTION_ID, VERSION, STEP_NAME, JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, COMMIT_COUNT, READ_COUNT, FILTER_COUNT, WRITE_COUNT, EXIT_CODE, EXIT_MESSAGE, READ_SKIP_COUNT, WRITE_SKIP_COUNT, PROCESS_SKIP_COUNT, ROLLBACK_COUNT, LAST_UPDATED) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; Duplicate entry '0' for key 'BATCH_STEP_EXECUTION.PRIMARY'; nested exception is java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'BATCH_STEP_EXECUTION.PRIMARY' Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'BATCH_STEP_EXECUTION.PRIMARY' 개선책으로는 아래와 같이 해봤는데도 안됐습니다. 1. @SpringBootApplication 주석 후 아래와 같이 진행 @EnableAutoConfiguration(exclude={BatchAutoConfiguration.class}) 2. @SpringBootApplication(exclude={BatchAutoConfiguration.class}) 를 통해 스프링 배치 테이블을 초기화하지 않게 막아도 동일하게 키중복 에러가 나는데 방법이 없을까요? 혹은 테이블 정보 delete해주고 했음에도 불구하고 동일합니다 ...
-
해결됨실전! 스프링 데이터 JPA
@Param 생략
@EntityGraph(attributePaths = {"team"})List<Member> findEgByUsername( String username); 일 때와, @EntityGraph(attributePaths = {"team"})List<Member> findEgByUsername(@Param("username") String username); 일 때 결과 값이 똑같이 나오는걸 확인했는데, @Param은 직접 JPQL에 "~~ = :username"을 지정하지 않는 이상, 쿼리 메소드 이름 기능으로 사용할 때, 생략해도 되고 생략 안해도 되는 게 맞나 확인차 질문드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문 submit 시에 save the transient instance before flushing 에러가 발생합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] 에러 메시지 내용은 org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.member -> jpabook.jpashop.domain.Member; 입니다. Member와 Order 클래스의 영속성 전이 문제인 것 같아서 각각 cascade = CascadeType.ALL 을 추가해주면 에러메시지는 사라지지만 주문내역에서 회원명이 나오지 않습니다ㅠㅠ 또 회원목록에서 등록하지 않은 회원이 생성됩니다. 그래서 일단 cascade 추가 전 Order 클래스와 Member 클래스의 코드 첨부합니다. 구글 드라이브 주소입니다. https://drive.google.com/file/d/1j0oevd3vhsXt8e1LwuuVgS7fu6RLY8yN/view?usp=sharing
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하세요 영한님 스프링 부트 관련 질문 드립니다.
이번 강의를 들으면서 H2데이터베이스가 아닌 MySQL에 적용을 해보고 싶어서 시도를 해봤는데요, 도커에 MySQL을 띄우고 실행을 하였는데 궁금증이 생겨 질문 드립니다. 스프링 부트의 application.properties에 적는 MySQL환경 설정과 docker-compose.yml에 적는 MySQL환경 설정을 둘다 입력해 줘야 하나요?? 한곳만 입력해줘도 괜찮은가요? 좋은 강의 감사합니다 ㅎㅎ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
intellij가 error를 잡지 못합니다....
[질문 내용] 아래 스크린샷과 같이 intellij 에서 @Service @Repository 어노테이션을 달지 않았음에도 Controller에서 에러를 표시하지 않습니다.. 실행시에는 에러를 잡아내서 강의 진행에는 무리가 없으나, 혹시 이유를 알고싶어서 질문합니다... 1. 아직 @Service 를 추가하기 전이나, 2. intellij가 error 경고를 띄우지 않음 3. 실행시에는 에러를 잘 잡아냅니다.
-
해결됨스프링 부트 개념과 활용
spring boot profile 관련 내용
수강자 분들이 헷갈리시는 분이 있어서 질문글에 남겨드립니다. spring boot 프로파일 설정중에 spring.profiles.include = myprofile 이 부분에서 에러가 많이 나고 저도 똑같은 경험을 해서찾아보다가 spring boot 2,4버전 이후부터는 다음과 같이 기술한다고 합니다. spring.profiles.group."myprofile"
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
NotEnoughStockException에 대해서 조금만 더 자세한 설명 부탁드려도 될까요?
NotEnoughStockException에서 오버라이드를 해서 그냥 놔두는 이유를 조금만 더 명확하게 설명 부탁드려도 될까요? 그리고 5개를 오버라이드를 했는데 오버라이드를 할 수 있는 메소드들은 많이 있는데 그중에 어떤 메소드들을 오버라이드를 하는지, 그리고 그 메서드들을 오버라이드를 하는 이유와 마지막 한개는 필요가 없는 이유를 조금만 더 명확하게 알고 싶습니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
API를 사용하는 이유?
API가 뭔지는 알겠습니다. "객체(DTO)에 있는 값들을 JSON으로 반환하는 컨트롤러" 근데 이것을 왜 쓰는지는 감이 안옵니다.만약 조회의 결과를 JSON으로 클라이언트에 반환한다 치면,조회값이 엄청 많으니까 JSON으로 "축약"해서 보낸다는 느낌으로 이해 했는데 맞나요..? 클라이언트에서 서버로 왜 JSON으로 보내는지, 반대의 경우는 왜 그러는지 감이 안잡힙니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
cascade관련해서 문의드립니다.
cascade를 사용하는곳이 FK 가 없는곳이라고 생각하면 맞을까요? FK가 없는곳이면 부모Entity라고 생각을 하면 될 것 같은데.여기서 부모라고하면 변경되는 주체(?)를 표현한 것인데.예를들어 게시판과 첨부파일 테이블이 있다고 한다면게시판이 부모Entity이고, 첨부파일이 자식Entity라고 생각했을때(게시글을 지우면 첨부파일도 같이 지워지는 구조이기 때문에.. 첨부파일을 지운다고 해서 게시글이 같이 지워진다는 보장은 없으니까요)이럴 경우에는 게시판Entity에 cascade를 설정하는게 맞는 것 같은데 제가 이해하고 있는게 맞는걸까요?
-
해결됨Spring Boot JWT Tutorial
postman 실행 결과
안녕하세요. 강의 잘 듣고 있는 학생입니다! 다름이 아니라 이클립스를 통해 프로젝트를 생성하고 예제 소스와 똑같이 만들었는데 postman으로 테스트 결과 저렁게 나오네요... 구글링해도 잘 모르겠어서 댓글 남깁니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
질문있습니다
강의 잘보고있습니다. 강의 잘 따라하다가 갑자기 떠오른건데 이거 h2 데이터베이스로 연동해서 사용하는건데 톰캣내장서버 껏다가 키면 왜 제가 저장했던 데이터가 날아가는거죠?? db사용하면 메모리저장이랑 다르게 서버껏다켜도 db에 저장했던 값이 있어야되는거아닌가요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테이블 생성할 때 문의드립니다.
테이블을 생성할 때 설명중 객체는 타입이 있어서 명확하게 member.id를 구분할 수 있는데 테이블에서는 구분하기가 어렵고 조인등의 쿼리를 짤 때도 불편하다고 해서 member_id로 잡아주신다고 하셨는데.. 이런 내용이 PK나 FK 에만 해당이 되는건지 궁금합니다. 예를들어 member라는 테이블에member_id, name이라는 필드가 있고, item이라는 테이블에도 item_id, name이라는 필드가 있을경우 name이라는 필드명이 겹치는데 이럴 경우에는 테이블 구조를 짤 때 그냥 name으로만 하시는지 아니면 member_name, item_name으로 하시는지 궁금합니다.강의를 쭉~~ 들으면서 드는 생각은 PK, FK와 관계되는것들(다른 테이블과 직접적인 연관관계를 맺고있기 때문에)만 구분을 하기 위해서 member_id, item_id로 만드는 것 같은데 제가 이해한대로 실무에 적용을 해도 문제가 없는지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Entity 저장에 관해 문의드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. 영항님! 좋은 강의 잘 듣고 있습니다. 강의를 듣고 토이 프로젝트를 진행하는 와중에 궁금한 점이 생겨 질문글을 올리게 되었습니다. 저는 Board라는 Entity를 다음과 같이 선언하였습니다. @Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "board_id")private Long id;private String title;private String topic;private String content;@Enumerated(EnumType.STRING)private StudyState studyState;@Enumerated(EnumType.STRING)private RecruitState recruitState;private Long headCount;@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "member_id")private Member member; 그리고 저는 프론트에서부터 전달받은 Dto로 실제 Board Entity를 저장하려고 했습니다. 그래서 저는 Dto로 부터 Entity를 만들 수 있는 메소드 toEntity를 다음과 같이 구성하였습니다. @Data@NoArgsConstructor@AllArgsConstructorpublic class BoardCreateRequestDto { private Long memberId; private String title; private String topic; private String content; private Long headCount; private StudyState studyState; private RecruitState recruitState; public Board toEntity() { return Board.builder() .title(this.title) .topic(this.topic) .content(this.content) .studyState(this.studyState) .recruitState(this.recruitState) .headCount(this.headCount) .member(new Member(this.memberId)) .build(); }} Board board = boardRepository.save(requestDto.toEntity()); 실제로 저장을 할 시에 Board Entity에는 Member를 넣어 저장하나, 실제 DB에서는 Board 객체에서의 Id만을 외래키로 저장하기에 다음과 같이 저장해도 무방하다는 것을 알게 되었습니다. 저는 이 방법이 MemberId를 통해 Member 객체를 찾지 않고 저장할 수 있기에 쿼리 1번을 덜 날릴 수 있어 비용적인 측면에서 조금의 이득이 생긴다고 생각하여 다음과 같이 구성해보았습니다. 이러한 방법이 문제가 있는지 궁금합니다.