묻고 답해요
138만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
팩토리 메서드를 정적으로 사용하는 이유에 대해서 궁금합니다
안녕하세요 영한님 강의 잘 듣고 있습니다^^전부터 궁금해 왔던 것인데요, 팩토리를 만들 때 정적으로 올리는 이유에 대해서 궁금합니다영한님이 다른 QnA에서 추천해 주신 내용들을 읽어보았으나 굳이 왜 "정적"영역으로 보내는 가에 대한 의문은 쉽게 풀리지 않습니다 ㅜㅜ일단 정적 팩토리 메서드로 보내면 생성자들에 대한 응집도가 크게 떨어지는 느낌입니다. "엘레강트 오브젝트"라는 책을 보면 생성자는 10~15개 까지도 만들고 퍼블릭 메서드를 최대한 적게 가져가라고 가이드를 주는데요, 정적 영역으로 보내면 주/부 생성자로 보낼 수 없기 때문에 그 많은 생성자들이 다 흩어지고, 생성자들 간 관계를 맺을 수 없기 때문에 유연성이 떨어지고 코드 중복이 자주 일어나는 효과가 나는 것 같습니다이는 굳이 정적 영역으로 보내지 않고 주/부 생성자로 구분하면 쉽게 해결될 일이 아닌가? 하는 생각도 들어 질문을 드립니다
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
비대칭키일 때 decrypt 질문입니다.
bootstrap.yml파일에는 암호화할 때 사용하는 개인키 위치만 알려줬는데 어떻게 복호화를 할 수 있는 건가요?디렉토리에 공개키를 생성했다고는 하지만 yml파일에 위치를 설정하진 않았는데 어떻게 복호화를 할 수 있는지 궁금합니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계의 주인을 양쪽 모두 설정할 경우
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]일대다[1:N] 강의의 16분 29초 쯤에 연관관계의 주인이 양쪽에 모두 있으면 망한다라는 언급이 있으신데, 순서가 꼬이거나 예측이 안된다는게 구체적으로 어떤 의미인지 예시가 있을까요?정말 단순하게 생각하면 어쨋든 연관관계의 주인이 아닌 쪽에서 mappedby를 통해 읽기 전용으로 설정하지 않아도 Member에서 추가하나 Team에서 추가하나 반영될 수 있다면 오히려 좋지 않나 싶은 의구심이 들어서 질문드립니다감사합니다 :)
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
컬렉션 필드에서 초기화 질문이 있습니다. (arraylist 기본 사이즈 문제)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]ArrayList는 기본 사이즈를 10으로 생성하고 이후 사이즈를 초과할 경우 2배로 늘린 후 기존의 값을 복사하는 것으로 알고 있습니다.만약 사용자의 orders 개수가 10개 이상이라면, 이것을 지속적으로 늘리는 연산이 필요할 것으로 생각됩니다.실무에서는 arraylist를 필드 초기화할 때, 이런한 것을 예상해서 넉넉한 사이즈로 초기화를 하는지, linkedlist로 초기화하여 불필요한 연산을 줄이는 지 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
api/v1/members 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.400 에러가 뜨는데 어느 부분을 놓쳤을까요?@RequiredArgsConstructor @RestController public class MemberApiController { private final MemberService memberService; @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { Long id = memberService.join(member); return new CreateMemberResponse(id); } @Data static class CreateMemberResponse { private Long id; public CreateMemberResponse(Long id) { this.id = id; } } }
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
안녕하세요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 1. 준영속 상태가 되면 영속성 컨텍스트의 1차 캐시에는 존재하지 않고 DB에만 존재하는 걸로 이해했는데 맞을까요? 2. @Entity 어노테이션을 붙여주면 엔티티 팩토리가 그 클래스를 관리하게 되는게 맞는지, 그렇다면 DB 연결을 안하고 먼저 @Entity 를 통해 테이블을 생성한 후, 마지막에 DB 연결을 해주어도 문제가 없는 것인지 궁금합니다. 3. H2 데이터베이스를 localhost 가 아닌 도메인 주소(?) 로 접속하면 다른 PC의 사용자들도 DB 관리를 같이 할 수 있는 건가요? 4. @ManyToOne 은 @JoinColumn 과 같이 쓰고, @OneToMany 는 MappedBy 랑 같이 쓴다고 이해해도 괜찮을까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
DTO 설계와 상속 관계간의 생성메서드
안녕하세요. DTO의 설계에서 의존관계가 중요하다고 하셔서, 강의 코드를 개선하는 도중 제가 설계한 DTO의 의존관계가 맞는지 질문하고 싶습니다.또한 Item 도메인에 생성메서드를 정적메소드로 구현한 뒤 Item을 상속 받는 Album, Book, Movie에도 생성메서드를 정적메소드로 구현한다고 하면 제가 설계한 방식이 맞는지 궁금합니다. 서로 상속관계인데 의존성을 넣는 것이 바람직하지 않을까요??먼저 저는 수업 코드에서 Book만 다루는 걸 나중에 Item 종류별로 다루는 걸로 개선하고 싶어서 BookForm 대신 ItemForm으로 바꾼 점 참고 바랍니다.controller/ItemForm.classDTO 설계 관련 코드controller/ItemForm.class service/UpdateItemDto.class service/ItemService.classdomain/Item.classdomain/Book.class생성메서드 관련 코드domain/Item.classdomain/Book.classBook클래스의 생성 메서드 부분에서 저렇게 의존관계 없이 구현하는게 바람직한지 궁금합니다. 아니면 Item과 의존관계를 구현하는 것이 바람직한지 궁금하구요. 또는 상속관계에서 더 좋은 생성메서드를 만드는 방안이 있는지도 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품 등록 시 오류
Whitelabel Error PageThis application has no explicit mapping for /error, so you are seeing this as a fallback.Sun Jan 22 16:28:49 KST 2023There was an unexpected error (type=Internal Server Error, status=500).org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: form near line 1, column 10 [select i form Item i]; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: form near line 1, column 10 [select i form Item i]org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: form near line 1, column 10 [select i form Item i]; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: form near line 1, column 10 [select i form Item i] 상품 등록화면에서 submit 버튼 누르면 이런 오류가 뜹니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
ManyToOne 양방향 매핑에 대한 질문입니다.
설명에서 사용하신 멤버와 팀관계에서 멤버N : 1팀이라고 하고 만약 팀A에 속한 사람을 조회하면멤버를 통해 조회하면 일일이 멤버객체에서 팀A인 사람을 골라서 조회되는 것으로 알고있는데, 만약 팀을 통해 조회하면, 팀A에있는 members를 가져오는데 어떻게 동작되는건가요?? 팀은 mappedBy로 설정해두었습니다.둘다 같은 동작이 이루어지나요??
-
미해결
JPA 식별관계 사용에 대해서...
Jpa를 사용할 때 테이블 관리를 쉽게 하기 위해서 비식별 관계로 테이블을 설계하라고 들었는데 그러면 실무에서 jpa쓸 때 식별관계를 안쓰나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
allocationSize 관련하여 질문올립니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 잘모르겠습니다 ㅎㅎ..3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]1. 데이터 삽입 순서 관련 질문서버가 여러 대 있다고 가정했을 때, 각 서버에 하단의 이미지처럼 메모리에 50개씩 값을 올려둘 경우, DB에 들어가는 데이터가 순차적으로 안들어가지 않나요?구체적으로 생각해보지는 않았지만, 순차적으로 데이터가 들어가지 않을 경우에 대한 이슈가 있지 않을까 싶어서 질문드립니다!2. 중간에 비어있는 구간 관련 질문위와 마찬가지로 서버가 여러 대 있고 각 서버마다 50개씩 메모리에 할당했다고 가정했을 때, 특정 서버가 죽게되면 죽은 서버의 메모리가 가지고있던 개수만큼의 공백이 생기지 않나요?(거의 그럴 일은 없겠지만) 서버가 시도때도없이 다운될 경우 아무리 Long 타입을 지정했음에도 수가 넘어가는 케이스가 생기지 않을까 싶습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JUnit 테스트 콘솔에서 SQL문
JUnit 테스트 콘솔의 SQL문에서 1차 캐시에서 엔티티를 조작하고 있는지 아니면 데이터베이스에서 DML문을 써서 조작하고 있는지 확인을 하고 싶은데, JUnit 테스트 코드 실행후 콘솔창을 보면, SQL문은 정상적으로 나오는데, 1차 캐시에서 삭제한건지 데이터베이스에서 삭제를 시도한건진 확인이 안됩니다. 확인할 수 있는 방법이 있을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
연결 에러, 파일에러 안되는 사람 보소
Connection is broken: "java.net.SocketTimeoutException: connect timed out: localhost" [90067-214] 90067/90067이 파일 다 실행시키면서 해도 안되길래 보니까 어떤cmd 혼자가 에러메세지 숨겨놓고 있드라 포트 바꾸라고-> 포트번호 8082 기존에 쓰던거 죽여서 해결함cmd에서 포트번호 죽이는 방법 검색 ㄱ 파일관련 에러(jdbc:h2:~/test 해도 안됨 localhost~~도 안됨)-> 파일 직접 만들어서 해결 화가 나서 컴퓨터 모니터 구멍 낼뻔했다
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
영속성 전이 관련해서 질문드립니다.
안녕하세요 강의 수강 후 활용해서 프로젝트를 진행중인데, 영속성 전이 관련해서 질문이 있습니다.강의 내용처럼 Order에 있는 member에 다음과 같은 설정을 하면@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="member_id") private Member memberId;object references an unsaved transient instance - save the transient instance before flushing에러가 발생합니다.그래서 다음과 같이 영속성 전이 설정을 하면 에러는 안뜨지만 같은 멤버가 두번씩 저장되는 문제가 발생합니다.@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) @JoinColumn(name="member_id") private Member memberId;해당 Order가 Create되면서 Member테이블에 member가 저장되는데 이미 해당 멤버는 db에 저장되어있는 상황. (회원가입하면서 멤버가 저장되어있었음)ㄴ test05가 두번 저장되어있음강의 코드는 Order에 영속성 전이 코드를 넣지 않아도 되던데 해당 에러를 발생시키지 않으려면 어떻게 해야할까요?Member 엔티티와 Order 엔티티 코드 입니다.@Entity @Table(name = "ORDERS") @NoArgsConstructor @Getter public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="member_id") private Member memberId; @Column(name = "post_id") private Long postId; @Embedded private Point price; @Column(name="order_at") private Timestamp orderAt; public static Order of(Member member, Long postId, Point price){ Order order = new Order(); order.setMember(member); order.postId = postId; order.price = price; return order; } public void setMember(Member member){ this.memberId = member; member.getOrders().add(this); }@Entity @Table(name = "member") @Getter @Setter @NoArgsConstructor @SQLDelete(sql = "UPDATE member SET deleted_at = NOW() where id = ?") @Where(clause = "deleted_at is NULL") public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "member_id") private String memberId; private String password; @Column(name = "member_name") private String memberName; private String email; @Column(name = "role") @Enumerated(EnumType.STRING) private MemberRole role = MemberRole.USER; @OneToMany(mappedBy = "memberId") private List<Order> orders = new ArrayList<Order>(); public static Member of(String memberId, String password, String memberName, String email){ Member member = new Member(); member.setMemberId(memberId); member.setPassword(password); member.setMemberName(memberName); member.setEmail(email); return member; } public static Member of(MemberDto dto){ Member member = new Member(); member.setMemberId(dto.getMemberId()); member.setPassword(dto.getPassword()); member.setMemberName(dto.getMemberName()); member.setEmail(dto.getEmail()); member.setRole(dto.getRole()); return member; }
-
해결됨스프링 프레임워크는 내 손에 [스프2탄]
/board/get?idx=${vo.idx} 질문
상세보기 구현하는 과정에 있어서 궁금한점이 있어서 질문드립니다.get이라는 컨트롤러를 만들고 /board/get?idx=${vo.idx}에서 선택한 idx에 따라서 링크가 이동되는것은 강의에서 잘 풀어주셔서 이해가 잘가는것 같습니다.질문을 드리자면 단순하게 get?idx <--- 여기서 물음표를 넣으셨는데 이건 정해진건지 궁금하고 어떤 이유에서 ?가 적힌건지 궁금합니다. get!!idx 이런식으로 적으니까 안되더라구요 ㅠㅠ...연휴 잘보내시길 바라면서 질 좋은 강의에 감사 드립니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
TypeQuery 질문있습니다.
다름이 아니라, 강의 19분대쯤을 듣다가, query.getSingleResult는 결과가 반드시 하나라고 배웠습니다.그래서 결과가 없을때의 에외를 확인하고 싶어서 아래와 같이 코드를 짰는데, 오류가 안나네요 뭐가 문제일까요..?Member member = new Member(); member.setUsername("member1"); member.setAge(10); em.persist(member); em.flush(); em.clear(); TypedQuery<Member> query = em.createQuery("select m from Member m where m.age=12", Member.class); Member singleResult = query.getSingleResult(); tx.commit();
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
안녕하세요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1. 트랜잭션의 시작과 끝이라고 한다면 스프링 부트 실행이 시작, 스프링 부트 종료가 끝이라고 생각을 하면 되는 건가요? 2. 다른 강의에서는 Gradle을 추세라고 하셨는데, Gradle 이 아닌 Maven 으로 실습을 하는 특별한 이유가 있을까요? 3. SpringBoot 를 이용하면 EntityManagerFactory 생성을 직접 할 필요가 없는 건가요? 4. h2에 table 을 미리 생성한 후 값을 넣는 이유는 무엇인가요? <실전 스프링 부트 JPA 웹개발 1> 에서는 이런 과정이 없었던 것 같아서 헷갈립니다. 5. JPQL 보다는 QueryDsl 을 많이 쓰신다고 하셨었는데 현재 수업 과정은 JPA 의 발전 과정을 소개해주시는 걸로 이해해도 괜찮을까요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
이번 강의에 대한 질문이 있습니다.
아직 개인적으로 개발 공부 중인 저에게 너무 앞서가는 내용이 아닌가 싶기도 하고 실제로 Map 등 java에 관한 이해가 아직 부족해서 이 부분을 패스하고 나중에 필요할 때 다시 들어도 공부하는 틀에 큰 지장이 없는지 여쭤보고 싶습니다.
-
미해결실전! 스프링 데이터 JPA
하나의 작업을 여러 서비스 계층에서 나눠서 할때 트랜잭션 처리
예를들면 하나의 게시글을 처음 작성하며 여러 태그도 함께 붙이는 내용을 구현할 때 게시글 관련해서 PostService, 태그 관련해서 TagService로 처리를 한다고 가정해보겠습니다. public ResponseEntity(@RequestBody PostRequest postRequest) {Post post = postService.post(postRequest.toPost());tagService.addTag(postRequest.toTag());return ResponseEntity ...;}이런 형태이고 post() 메서드를 통해 게시글을 저장하고addTag() 메서드를 통해 태그를 저장한다고 할때 서로 다른 서비스 클래스의 메서드에 @Transactional 이 걸려있어서 만약 Post 엔티티를 저장한 후 Tag 엔티티를 저장해야 하는 상황에서 중간에 문제가 발생한다면 Tag는 저장이 안되었지만 Post는 저장이 되는 문제가 발생합니다. 간단하게 상황 설명만을 위해 작성한 예시라 내용이 이상하지만 이런 상황에서 트랜잭션을 한번에 처리할 방법이 있을까요? 결국 하나의 트랜잭션에서 처리해야할것 같아서 위 예시의 경우 postService에서 TagService의 addTag를 호출하는 형태로 하면되지 않을까 고민해 봤습니다.보통 이런식으로 한번에 처리해야 하는 로직이 여러 서비스 계층에 나누어 있는 경우? 처리를 어떤식으로 하는지 어떤 방법들이 있는지 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
assertThrows() 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]assertThrows 메서드를 사용해 주문 취소 테스트 예를 실행하던 중 궁금한 점이 생겨 질문을 남깁니다.배송 완료 상황일 때는 취소가 되지 않는 예외를 적용한 것에 대해 제가 작성한 테스트인데요. 아래 코드를 통해 말씀드리겠습니다.// given Member member = createMember(); Item item = createBook("JPA", 10000, 10); int orderCount = 2; int curStock = item.getStockQuantity(); Long orderId = orderService.order(member.getId(), item.getId(), orderCount); // when // 배송 완료 상태면 취소가 안됨 Order getOrder = orderRepository.findOne(orderId); getOrder.getDelivery().setStatus(DeliveryStatus.COMP); IllegalStateException e = assertThrows(IllegalStateException.class, () -> orderService.cancelOrder(orderId)); Assertions.assertThat(e.getMessage()).isEqualTo("이미 배송완료된 상품은 취소가 불가능합니다."); // order 취소되는 경우를 가정하고 위에서 테스트했다고 쳤을 때 어떤 상태인지 보고 싶음! System.out.println(orderRepository.findOne(orderId).getStatus()); 아래와 같이 getStatus를 출력해보면 CANCLE이 아닌 ORDER라고 출력이 됩니다.getOrder.getDelivery().setStatus(DeliveryStatus.COMP); IllegalStateException e = assertThrows(IllegalStateException.class, () -> orderService.cancelOrder(orderId)); Assertions.assertThat(e.getMessage()).isEqualTo("이미 배송완료된 상품은 취소가 불가능합니다."); // order 취소되는 경우를 가정하고 위에서 테스트했다고 쳤을 때 어떤 상태인지 보고 싶음! System.out.println(orderRepository.findOne(orderId).getStatus());바로 이 부분인데요. assertThrows 내에서 orderCancle을 진행해서 테스트를 진행하는데 왜 주문의 상태가 CANCLE이 아닌 ORDER로 출력이 되는 지 알 수 있을까요?객체의 얕은 복사, 깊은 복사와 관련이 있는 것인지 궁금합니다.