안녕하세요, 지금 강의랑 직접적으로 관련된 의문은 아니지만, 지금까지 이 강의를 진행하면 든 의문이 있어서 해소하고 싶어 질문드립니다. DB에 insert을 할 때 사용되는 IDENTITY 전략과 SEQUENCE 전략이 그것인데요. (우선 JPA 강의는 이게 처음이라서 검색을 통해 해소하고 싶었지만 제 검색 실력이 부족해 질문드립니다) 1. 제가 검색을 통해 알아본 결과, GenerationType.IDENTITY는 em.persist() 실행 시점에 DB에 INSERT를 날리고, PK값을 가지고 오고, Sequence는 DB로부터 sequence를 가지고 와서 em.persist()할 때 가지고 온 sequence를 영속성 컨텍스트에 주입한다고 알고 있습니다. 근데 그렇게 할 거면 차리리 그냥 IDENTITY 역시 다음 AUTO_INCREMENT 값이 뭔지만 가져와서 영속성 컨텍스트에 넣고 실제 ISNERT는 flush할 때 넣어주는 방법도 고려해볼 만한 거 같은데 왜 그런 전략은 취하지 않은 건지 의문이 들었습니다. 2. sequence 같은 경우는 allocation_size가 50일 때, 첫 번째 INSERT 쿼리 중 에러가 발생해서 해당 트랜젝션이 종료되면 해당 50개의 sequence는 날라가고 51번째부터 시작하는 건지도 궁금합니다 3. 마찬가지로 IDENTITY 전략에서 em.persist() insert 중 에러가 발생해서 rollback이 되기 전에 다른 insert 요청이 날라와서 insert를 해야하면 처음 에러가 발생했을 때 사용된 PK는 뛰어넘고 auto_increment가 진행되는 건지도 알고 싶습니다.
현재 복습중입니다. 12분 34초에 나오는데, 분명 예전에는 @AfterEach 를 넣지 않으면 repository에서 기존 값들이 지워지지 않아 테스트에 오류가 생겼었습니다. 그런데 지금은 @AfterEach에서 clear 해주지 않아도 알아서 다른 테스트들에서 저장한 값들이 저장되지 않는데, 기본 구조가 바뀐 걸까요? 예를 들면 findAll에서 repository에 멤버1, 멤버2를 저장했습니다. 그러면 레포지토리의 사이즈는 2가 되어야 하는데, 다음 테스트 맨 처음에 repository.size를 출력해주면 0이 나옵니다.
안녕하세요 선생님 강의 잘 듣고 있습니다 ^^ 멘토링 문제에서 만약 A학생이 멘토이고, B학생이 멘티가 되는 짝이 되었다면, A학생은 "M번의" 수학테스트에서 " 모두" B학생보다 등수가 앞서야 합니다. 라고 나옵니다. 주어진 테케에서 (문제에 주어진 테케) 4 3 3 4 1 2 4 3 2 1 3 1 4 2 (문제 해설) 출력설명 (3, 1), (3, 2), (4, 2)와 같이 3가지 경우의 (멘토, 멘티) 짝을 만들 수 있다. 라고 나옵니다. 근데 (3번학생,1번학생) , (3번학생,2번학생) , (4번학생,2번학생) 3 1 4 2 에서 3번학생은 1번학생 보다 등수가 높지 않아 "모든 m번의 경우"에서 앞선다라는 문제 조건에 위배 되지 않나요? (3,2) , (4,2)도 마찬가지 입니다. 감사합니다!
안녕하세요 영한님 감사합니다 첫번째 : new 명령어를 사용해서 JPQL의 결과를 DTO로 즉시 반환하면 SELECT 절에서 원하는 데이터를 직접 선택하므로 네트워크 용량을 최적화 할수 있다고 해주셨는데 뒤로 돌아가서 JPQL 페치조인도 마찬가지로 원하는 데이터를 직접 선택해 보고싶어서 이런식으로는 못하나요 ? 테스틀 해봤는데 에러가 나서 질문드립니다. ======================================== 두번쨰 : 18:40 설명은 xToOne 관계에선 페치조인이 필요 없다고 이해 하면 되는거죠 ???
스프링부트 gradle 2.6.2 버전인데 설치하고 나서 기본 세팅된 프로그램 돌려봤는데 다음과 같은 워닝이 떠요 Java HotSpot(TM) 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release. 어떻게 해결할 수 있을까요?
create react app을 통해 프로젝트를 진행 중입니다. 원래 컴퓨터에서는 프로젝트가 정상적으로 작동 되었는데, 다른 컴퓨터에서 git clone을 받아 npm install 후 npm start 진행하니, 1. Cannot read property 'tap' of undefined 상기와 같은 에러가 발생하여 검색해보았더니, webpack version문제라고 나와 5버전에서 4버전으로 내려주었습니다. 2. <iframe style="position: fixed; top: 0px; left: 0px; width: 100%; height: 100%; border: none; z-index: 2147483647;"></iframe> 그 후 리액트를 실행하고, 저장할 때마다 iframe이 자동으로 주입되어 홈페이지의 click을 막습니다. 혹시 이와같은 문제를 겪으시는 분들 중에 해결하신 분이 계실지요...? 원래는 다른 컴퓨터에만 문제 발생하였는데, 이제 작업하던 원래 컴퓨터에까지 발생하기 시작했습니다. 저는 임시 방편으로나마 css에서 ifame display none 시키고 작업중인데, 무슨 이유로 생기는 오류인지 모르겠습니다.
안녕하세요 리액트를 익히고자 수업을 듣고있는 수강생입니다. 강의를 잘 따라가는 와중 환경세팅부분에서 막혔습니다. - 증상: Visual Studio2022에서 프로젝트 실행 시 첨부파일과 같은 오류가 발생하며 오류 발생 - 추가 사항 (1) visual studio가 아닌 VS Code, nodejs에서 실행하면 정상 동작되는거 확인하였습니다 (2) cmd, powershell에서 npm명령 잘 작동하고 있습니다. - 캡처화면
안녕하세요. 회사에서 NFT를 발행해주는 프로젝트를 진행하려는데요. 올려주신 강의를 보고 하나씩 처리를 해가고 있는데, 프로젝트 구성의 감을 잡지 못해서 문의를 좀 드리려고 합니다. 이 곳에 질문을 남겨도 될지는 모르겠지만, 너무 답답해서 문의를 드립니다. nodejs 를 사용해 backend(API 서버)를 만들고 raect(3000번 포트) 에서 proxy 를 설정해 nodejs(3001번 포트) 의 데이터를 받아오도록 frontend를 만드는 프로젝트를 진행하고 있습니다. 이 프로젝트는 NFT를 발행해주는 사이트를 만드는 것이 목표인데요. 만약 올려주신 drizzle-dapp으로 backend(API 서버)와 연결하는 back을 만들려면 package.json의 main을 truffle-config.js로 해도 괜찮을까요? 그게 아니라면 프록시서버를 따로 두지 않고 react-node 가 proxy로 설정되어 있는 상태로 NFT 거래가 가능하게 만들려면 truffle 을 어떻게 사용해야 할지 조언 해주실 수 있을까요...? 강의 내용과 맞지 않는 내용 올려서 죄송합니다.
안녕하세요 영한님 서포터즈님들 상속 매핑에 대해 예제를 작성하는 중에 궁금한 점이 생겨 질문드립니다. 제가 게시판을 생성해서 게임 게시판. 일정 게시판 등 종류 별로 만들 때, 어떤 전략을 사용하는게 효율적인가 생각해보았습니다. 현재 자식 게시판들은 모두 같은 필드를 가지고 있습니다. 즉, 부모 게시판에 있는 필드만을 사용합니다. 1. SINGLE TABLE 전략 해당 전략을 사용하게 된다면 부모 테이블에 자식 테이블의 필드들이 한 테이블에 있게 됩니다. 특정 게시판을 조회하기 위해서는 모든 게시판 객체를 가져올텐데, 시스템의 규모가 크지 않고, join할 필요가 없기 때문에 현재는 해당 방법이 효율적이라 생각합니다. 2. JOIN TABLE 전략 추후에 게시판들이 늘어나게 되고, 다른 게시판 종류의 추가로 필드를 추가할 필요가 있다고 가정해봤습니다.(확장성 고려) 그렇다면 1번 전략을 사용할 때, 특정 게시판을 조회하기 위해서는 모든 게시판을 다 탐색해야하는데, 조인 전략을 사용하게 되면 특정 게시판을 조회할 때 그 특정 게시판 테이블만 조회하면 된다고 생각합니다. 따라서 게시판들이 늘어나게 되면 해당 방법이 효율적이라 생각합니다. 결론 그래서 제가 예제를 만들 때 사용한 전략에 대해 저 자신을 위와 같은 이유로 납득시켰는데 이게 맞는지 궁금합니다 그렇다면 결국 대부분의 실무에서는 JOIN 전략을 사용할 수 밖에 없나요?
안녕하세요 항상 좋은 답변 남겨주셔서 감사합니다 OrderItems까지 같이 조회되는 이유가 궁금해서 글을 적게 되었습니다. @GetMapping ( "/api/v1/simple-orders" ) public List<Order> ordersV1 () { List<Order> orders = orderService .findOrders( new OrderSearch()) ; orders.forEach(order -> { order.getMember().getName() ; order.getDelivery().getStatus() ; }) ; return orders ; } V1 컨트롤러는 다음과 같습니다. @Entity @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Table (name = "orders" ) public class Order { @Id @GeneratedValue @Column (name = "order_id" ) private Long id ; @ManyToOne (fetch = FetchType. LAZY ) @JoinColumn (name = "member_id" ) private Member member ; @OneToMany (mappedBy = "order" , fetch = FetchType. LAZY , cascade = CascadeType. ALL ) // order 가 만들어지면 orderItem 이 만들어지기 때문에 영속성 전이한다 . private List<OrderItem> orderItems = new ArrayList<>() ; @OneToOne (fetch = FetchType. LAZY , cascade = CascadeType. ALL ) private Delivery delivery ; private LocalDateTime orderDate ; @Enumerated (EnumType. STRING ) private OrderStatus status ; ORDER는 다음과 같습니다. @Entity @Getter @Setter public class OrderItem { @Id @GeneratedValue @Column (name = "orderitem_id" ) private Long id ; @ManyToOne (fetch = FetchType. LAZY ) @JoinColumn (name = "item_id" ) private Item item ; @JsonIgnore @ManyToOne (fetch = FetchType. LAZY ) @JoinColumn (name = "order_id" ) private Order order ; private int orderPrice ; private int count ; ORDER_ITEM은 다음과 같습니다. 여기서 V1 컨트롤러를 통해서 쿼리를 날리면, 뒤늦게 Lazy Loading을 통해서 Order_Item들이 프록시 초기화가 되는 것처럼 나갑니다. 그런데 실제로는 프록시가 초기화도 되어있지 않습니다. 정리하면 이렇습니다 1. Order_Items는 Lazy Loading 설정이 되어있고, 프록시 객체를 강제 초기화 하는 과정도 없습니다. 그런데 왜 select 쿼리가 나가게 되는 것인지 알려주실 수 있으실까요? 2. orderItem에 대한 select 쿼리가 나갔음에도 불구하고 실제 응답에 있는 값은 null입니다. 이 경우는 어떻게 이해를 해야할까요? 항상 좋은 답변 주셔서 감사합니다!
안녕하세요. 항상 좋은 답변 해주셔서 감사합니다. 이번에는 @Transactional이 생략되는 이유가 궁금해서 글을 적게 되었습니다. @GetMapping ( "/api/v4/simple-orders" ) public List<SimplerOrderQueryDto> ordersV4 () { return orderSimpleQueryRepository .findOrderDtos() ; } @Repository @RequiredArgsConstructor public class OrderSimpleQueryRepository { private final EntityManager em ; public List<SimplerOrderQueryDto> findOrderDtos () { return em .createQuery( " select new jpabook.jpashop.repository.order.simplequery.SimplerOrderQueryDto(o.id, m.name, o.orderDate, o.status, d.address) from Order o " + " join o.member m " + " join o.delivery d " , SimplerOrderQueryDto. class ).getResultList() ; } } V4 컨트롤러를 개발할 때 궁금한 내용입니다. em.createQuery를 만들어서 dto를 바로 조회해오는 내용입니다. 제가 궁금한 부분은 @Transactional이 없어도 정상동작하는 부분입니다. 위 코드 상에는 어디에도 tx.begin() / tx.commit()이 되어있는 부분이 없는 것으로 보입니다. 따라서 트랜잭션 상태가 아니기 때문에 JPA가 DB 커넥션을 얻지 못한 상황으로 보이는데, DB에서 값을 읽어오고 있습니다. 혹시 어떤 조화로 이렇게... 트랜잭션 없이 값을 불러오는것인지.. 그리고 영속화가 되고 있는것인지를.. 알려주실 수 있으실까요? 감사합니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] Setter를 열어 둘 경우 엔티티에 변경으로 인한 유지보수가 힘들다고 말씀해주셨는데 혹시 Setter를 다 닫고 필요한 것만 연다거나, 비즈니스 메서드를 만드는 예제를 참고할 만한게 있을까요?
import java.util.Scanner ; public class Main { public int solution (String[] str , char word){ int count = 0 ; for (String s : str) { if (s.toLowerCase().charAt( 0 )==word){ count++ ; } } return count ; } public static void main (String[] args) { Main ch = new Main() ; Scanner sc = new Scanner(System. in ) ; String[] str = sc.nextLine().split( "" ) ; char word = sc.nextLine().charAt( 0 ) ; System. out .println(ch.solution(str , word)) ; } } 위 풀이가 왜 오답이라고 나오는건가요? .. 풀이도 정해져있나요?
안녕하세요! 지금까지는 문제 없이 잘 진행하고 있었으나 계속 찾아보고, alecture 폴더 내에 있는 소스코드와 비교를 해보아도 어떤 코드가 문제인지 모르겠어서 질문 글을 남기게 되었습니다. 해당 섹션 마지막에서 액시오스 코드를 작성하고 백엔드에 워크 스페이스를 생성하도록 요청하는 부분이 있는데요, const onCreateWorkspace = useCallback((e) => { console.log('ok'); e.preventDefault(); console.log(newWorkspace); if (!newWorkspace || !newWorkspace.trim()) return; console.log('b'); if (!newUrl || !newUrl.trim()) return; console.log('c'); axios.post('/api/workspaces', { workspace: newWorkspace, url: newUrl, }, { withCredentials: true, }, ).then((response) => { revalidate(); setShowCreateWorkspaceModal(false); setNewWorkspace(''); setNewUrl(''); }).catch((error) => { console.dir(error); toast.error(error.response?.data, { position: 'bottom-center' }); }); }, []); 워크스페이스 이름과, 워크스페이스 url 을 넣고 생성하기 버튼을 누르면 반응이 없어서 위 코드처럼 console.log 를 찍어서 확인해보니 newWorkspace 에 아무런 값이 담기지가 않고 있습니다. 해당 소스코드 및 라인 : https://github.com/Kuass/sleact/blob/master/setting/ts/layouts/Workspace/index.tsx#L32 입니다. onCreateWorkspace = useCallback 에 event 객체도 콘솔에 찍어서 보았으나 값은 정상적으로 있는데.. 왜 이럴까요 강사님 ㅠㅠ..