묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
호돌님 ! 이부분에서 Request클래스와 Response클래스가 DTO가 아닌 이유가 무엇인가요 ?
19분 20초에 호돌님께서 Request클래스와 Response클래스가 DTO는 아니라고 말씀하셨는데요~ 그렇다면 DTO라고 말할 수 있을 만한 조건은 무엇이고, 지금은 무엇이 부합하지 않는 걸까요 ? 그러면 현 상태에서 클래스는 엔티티도 아니고 DTO도 아닌 무엇이라고 지칭할 수 있는 클래스 인건가요 .. ?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강의 도중 말씀에 대한 간단한 질문
안녕하세요 강사님! 수업 너무 잘 듣고 있습니다. 다름이 아니라 설명하시는 도중18:20 가량 부터 잠깐 하시는 말씀에 대해 조금 이해가 덜 된 것 같아서 질문을 좀 드리고 싶어서 글을 남기게 되었습니다. 1. 설계하고 돌려서 테이블 생성된 것을 보고 원하는 대로 만들어졌는지 확인하는 것을 반복하라>> DB 테이블에 칼럼들 들어간 모습들과 내가 원하는대로 들어갔는지 확인하면서 해라! 라는 말씀으로 이해하면 되는 걸까요?2. 생성된 것을 그대로 쓰면 안된다(?)>> 제가 실무를 혼자서 진행해보고 DBA 분들과 얘기를 해본적이 없어서 이해가 잘 안됐을 수도 있는데, 혹시 이부분에서 말씀하시는 그대로 쓰면 안된다는게 어떤 부분인지 조금 더 말씀해주실 수 있을까요? Script 란 DB sql 들어가는 글들을 말씀하시는 것 같은데, 해당 SQL 을 따로 뽑아서 한번 쭉 본 후에 JPA DDL-AUTO 기능을 사용하지 말고 직접 DB workspace 같은 공간에 직접 import 를 해주는 방식으로 하라는 말씀이실까요?도움주셔서 감사합니다!
-
해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Editor 에 대한 질문..
안녕하세요. 강의를 듣다가 Editor 클래스에 대해 궁금한점이 생겨서 질문을 남기게 되었습니다.Editor 클래스를 사용하면 수정 시 content 나 title 값이 빈 값 또는 NULL 값이 들어오는 것을 방지하기 위한 목적도 있다하셨는데, 해당부분은 요청받는 컨트롤러에서 @Valid 로 검증할 수 있다고 생각되는데, 어떻게 생각하시는지 궁금합니다.Editor 클래스를 새로 생성하게 되면 Post 엔티티 클래스가 Editor 클래스에 의존하게 되는게 아닌가 생각이 드네요. 또 궁금한것이 Editor 클래스를 혹시 Post 엔티티 클래스 내부에서 선언해서 사용하는 것과 호돌맨님이 구현하신 것 처럼 외부에 클래스를 생성해서 사용하는 것과 다른부분이있을까요? 내부클래스로 사용한다면 확실하게 의도를 알 수 있을거 같아서 질문드립니다! package com.blog.api.domain; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import javax.persistence.*; import javax.validation.constraints.NotBlank; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; @Lob // DB에는 TEXT 타입으로 생성. private String content; @Builder public Post(String title, String content) { this.title = title; this.content = content; } public void edit(PostEditor postEditor) { this.title = postEditor.getTitle(); this.content = postEditor.getContent(); } public PostEditor.PostEditorBuilder toEditor() { return PostEditor.builder() .title(this.title) .content(this.content); } @Getter public static class PostEditor { private String title; private String content; @Builder public PostEditor(String title, String content) { this.title = title; this.content = content; } } }
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하세요. 스프링 정복 로드맵 db2편까지 완강하고 수강하는 학생입니다.
스프링 정복 로드맵 2편까지 완강 후 jpa 활용 1편을 듣고 있는데요.아무래도 시간이 좀 지난 강의라 db2편에서 들었던 jpa와 jpa 활용에서 듣는 jpa간에 셋팅이 다른 점이 있는데요.(entitymanager에 @persistencecontext 를 달아주시거나, 테스트하시면서 resources에 schema 를 설정하시는 대신 spring.jpa.hibernate.ddl-auto=create 를 설정하시는 등)db2편이 최신이므로, db2편을 기준으로 확장해나가는 편이 나은지 혹은 jpa shop에서 하시는 것을 새로이 기준으로 하면 좋을지 여쭤봅니다!별개로 강의는 항상 잘 듣고 있습니다.감사합니다!
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
SEQUENCE 전략 초기값과 호출 횟수 문의드립니다.
안녕하세요. 강의 열심히 듣고 있는 주니어 개발자입니다.강의 내용 똑같이 수행했으나 시퀀스 값이 다른 점이 있어 문의드립니다.(33:05) 부분에서 시퀀스 전략 속성값 initialValue=1, allocationSize=50 으로 설정했을시 persist 이전에 초기값이 -49라고 나오지만 제 환경에서는 초기값이 1로 나옵니다. H2 DB 2.1.214, Hibernate 5.6.10을 사용중인데 혹시 버전이 달라서 그런걸까요?로그에는 시퀀스에 대한 call next value를 호출하지 않으며 제 생각에도 initialValue=1로 명시되어 있기 때문에 초기값이 1인게 정상인 것 같은데 제가 놓치는 부분이 있는지 문의드립니다. 위 질문의 연장선으로 persist 1번 수행시 call next value 수행 결과는 아래와 같은데요. DB 시퀀스 자체의 increment값이 50이어서 51이 되는것은 이해하였습니다. JPA에서 51번째 데이터까지는 DB 시퀀스를 참조하지 않고 메모리에서 꺼내와야하는데 persist로 객체를 2번 저장시 아래와 같이 call next value가 2번 호출이 되고 시퀀스 값은 101이 됩니다.(33:43) 여기서 2번 호출 되는 이유가 JPA 애플리케이션에서 사용하는 allocationSize가 50이기 때문에 추후 자신이 사용할 메모리 시퀀스값을 선점하기 위해서라고 이해했는데요. (DB에는 51로 증가시켜놓고, 2부터 51까지 사용하기 위함) 이렇게 되면 제 경우에는 2를 사용하기 위해서 시퀀스 값을 101로 올려놓는 이상한 동작을 하는 것인데 이해가 가지 않습니다. 또한 위와 같이 52번째 객체 저장시 call next value가 한번 더 수행되어 시퀀스 값은 151이 됩니다.의도한대로 작동은 하지만 시퀀스가 한단계씩 밀려서 작동한다는 것이 이해가 가지 않습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 메서드
왜 연관관계 메서드에서 어떤 건 set이라고 하고 어떤 건 add라고 하나요??ex. setMember() / addOrderItem() //== 연관관계 메서드 ==// public void setMember(Member member) { this.member = member; member.getOrders().add(this); } public void addOrderItem(OrderItem orderItem) { orderItems.add(orderItem); orderItem.setOrder(this); } public void setDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this); }setMember는 member.getOrders()라고 하고 setDelivery()는 setOrders()로 다른 이유는 무엇인가요?? 여기서 this는 order를 의미하는 걸까요??
-
미해결실전! 스프링 부트와 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이 프록시에서 실 객체로 바뀌니 이것을 위해 조인하였을 것 같은데 맞을까요?
-
미해결실전! 스프링 부트와 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
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향이 왜그렇게 안좋은건가요?
유저객체에서 List<Order>를 가지는게 왜 안좋나요?유저 주문 목록을 가지고 있으면 성능면에서 더 이득이 크지 않나요?주문목록을 유저가 가지고 있다면 해당 주문ID를 바로 검색해서 더 빠르게 조회할 수 있지 않나요?하지만 유저가 List를 갖고있지 않다면 모든 주문목록에서 유저ID로 하나하나 검색해나가면서 불러오는게 상대적으로 많이 느리지 않나요?양방향이 될 수 있으면 없는게 좋다고 하셨는데, 실제로 통계를 만들때나 각종 상황에서 서로가 서로를 참조하는 일이 많지 않나요?판매자 입장에서 판매하는 아이템의 구매자의 주소를 아는 것은 중요할 것이고, 팀 입장에서도 팀에 어느 선수들이 있는지 아는게 중요하지 않나요?
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
My Json Editor
호돌맨님 안녕하세요강의 진행중 사용하는 My Json Editor Tool 은 혹시 어디서 다운로드 받을수 있을까요? 안내해주시면 감사하겠습니다 ㅎㅎ
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA에 Index 힌트 적용 질문드립니다.
최근에는 실무에서 JPA위주로 쿼리를 짜다보니, 성능이 안나오는 쿼리에 대해서는 index 힌트를 줘야 하는 상황이 종종 생기고 있는데요, 혹시 이럴땐 어떻게 하시나요? 마이바티스로 하기에는 특정쿼리만 빼기에는 일관성이 없는거 같고..JPQL로 짜자니 인덱스 힌트 지원이 안되는걸로 알고있구요..@natvieQuery로 생짜 쿼리 짜서 인덱스 힌트 주는 방법 밖에 없을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
애플리케이션 안에서 Sequence 관리 질문
안녕하세요! 수강생입니다. 항상 감사하며 공부하고 있습니다.DB Sequence 관리에 대해서 질문이 있습니다.Sequence 를 확보하고 사용하는 것의 관리 범위는 영속성 컨텍스트가 아닌, 애플리케이션 범위인가요?예를 들어 한 애플리케이션 안에서 두 개의 트랜잭션 A, B가 병렬적으로 엔티티를 영속화 한다고 치면 A.Entity.id = 1B.Entity.id = 2A.Entity.id = 3...이런식으로 애플리케이션 단위로 공유되는 것인지 궁금합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일대일 optional 여부에 따른 UNIQUE 제약
안녕하세요! 강의를 너무나 잘 듣고 있습니다. 일대일 강의를 들으면서 이것저것 만져보다가 @OneToOne(optional=true) 인 경우에는 UNIQUE 제약이 걸리지 않고 반대로 false인 경우에는 UNIQUE 제약이 걸리는 것을 알게 되었습니다.혹시 이렇게 구현된 이유가 무엇인지 알 수 있을까요?
-
해결됨실전! 스프링 부트와 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를 지양하는 편인가요?
-
미해결더 자바, 코드를 조작하는 다양한 방법
JIT 컴파일러와 인터프리터
안녕하세요, 백기선님.기존에 저는 JVM 내에서 JIT이 컴파일러와 인터프리터의 역할을 동시에 수행한다고 이해하고 있었는데요.자료(p.4)에서는 [실행엔진 : 인터프리터, JIT Compiler, GC ] 로 구성되어 있어서 질문드립니다.인터프리터와 JIT 컴파일러는 서로 분리되어 역할을 수행하는 것이 맞고,바이트 코드를 실행할 때, JIT 컴파일러가 전체를 싹 훑고, 반복되는 코드에 대해 메모리에 캐싱을 진행한 후, 인터프리터가 처음부터 순차적으로 읽어 나가다가, 반복되는 해당 지점에서 JIT Compiler가 다시 개입하여 캐싱된 코드를 꺼내오는 형태일까요? 이 부분이 조금 헷갈리기도 하고, 궁금하기도 합니다.혹은 어떤 문서를 보면 공부해볼 수 있을까요?(한국어 블로그에는 대부분 인터프리터와 JIT이 같다고 적어둔 경향이 많은 것 같고, 기선님께서 참고에 올려주신 글이나 해외 블로그에서는 둘을 분리해서 말하는 경향이 있는 것 같아서 더 헷갈리는 것 같습니다.)감사합니다!* 아래 질문과 비슷한 내용이지만, 답변 달아주신 링크에 접속이 안되서 부득이하게 다시 질문 드립니다ㅠhttps://www.inflearn.com/questions/99765
-
미해결실전! 스프링 부트와 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를 두고 테스트를 하기때문에 이러한 고민은 안해도 되는게 맞는거겠죠?