안녕하세요! 양질의 강의 감사드립니다. 구현 중 해결되지 않는 부분이 있어 질문 올립니다. 사용자가 의도한 움직임만 하면 좋겠지만, 간혹 직접 URL을 입력하는 경우에 대해 고민하고 있습니다. 여기에서 발생한 한가지 문제가 있습니다. 만약 사용자가 게시글을 조회하고자할 때 정상적으로 조회하는 것이 아닌, URL을 통해 게시글의 id를 직접 접근하는 경우를 생각했습니다. 그런데 만약 해당 id가 DB에 없을 때가 있을 수 있고, 이것이 문제가 될 것입니다. 이 때 브라우저에 alert를 발생시키고 Redirect 시키도록 만들어보았습니다. 그런데 이 때 정상적인 게시글도 접속시 alert가 발생하는 것을 발견했습니다. 확인해보니, 서버의 payload값이 클라이언트의 status를 업데이트하기전에 이미 리액트가 초기렌더링을 마쳐두어 기본값으로 설정해뒀던 false 값으로 인해 정상적인 글도 alert가 발생하는 것을 확인했습니다. 물론 false일 때 텅 빈 <div>를 렌더링시킨 뒤, 리렌더링되는 것을 기다려도 되겠지만 리액트가 setState를 마치고나서 렌더링하는 동기적인 방법이 있을까요? 위 이미지에서 보시는 것처럼 false는 서버로부터 payload값을 받아와 저장하는 ServerRes status의 기본값이고, 여러번 false로 렌더링되다가 서버에서 보내준 payload 값을 ServerRes에 업데이트하여 유도된 페이지가 렌더링되는 것을 확인할 수 있었습니다. 아직 react-hook이 익숙하지 않아 발생하는 문제인 것 같습니다 ㅠ.ㅠ. 감사합니다.
안녕하세요! 저번에 문의한 내용에 대한 답변 너무 너무 감사합니다. 이번에도 하나 더 질문 드립니다. 로컬pc에서 가나슈어를 이용하여 테스트하면 정상적으로 동작합니다. 하지만 서버에 geth설치 후 실행하면 3번째 setTx를 이용하여 구현한 부분이 에러가 나네요! 이것저것 로그를 찍어보고 있는데요 Returned error: invalid sender <-- 이런 오류가 발생되네요.. 혹시 어떤 오류 인지 아시는지요~ 전체 오류 로그 txCount ==>113 from ==>0xE9bb502a7150d5326bE9a16BAA9aada75a644c4b privateKey ==> ������v�� �t��ʥ%m�%� }��< address ==>0xd617FB0b6ba3f3855c903a73225DCbD4511E9Fd1 data ==>0x60fe47b100000000000000000000000000000000000000000000000000000000000085c2 verifySignature =>true XshellError: Returned error: invalid sender at Object.ErrorResponse (/home/dapp_tx/node_modules/web3-core-helpers/lib/errors.js:28:19) at /home/dapp_tx/node_modules/web3-core-requestmanager/lib/index.js:302:36 at XMLHttpRequest.request.onreadystatechange (/home/dapp_tx/node_modules/web3-providers-http/lib/index.js:98:13) at XMLHttpRequestEventTarget.dispatchEvent (/home/dapp_tx/node_modules/xhr2-cookies/dist/xml-http-request-event-target.js:34:22) at XMLHttpRequest._setReadyState (/home/dapp_tx/node_modules/xhr2-cookies/dist/xml-http-request.js:208:14) at XMLHttpRequest._onHttpResponseEnd (/home/dapp_tx/node_modules/xhr2-cookies/dist/xml-http-request.js:318:14) at IncomingMessage.<anonymous> (/home/dapp_tx/node_modules/xhr2-cookies/dist/xml-http-request.js:289:61) at IncomingMessage.emit (events.js:388:22) at endReadableNT (internal/streams/readable.js:1336:12) at processTicksAndRejections (internal/process/task_queues.js:82:21) { data: null } InternalServerError: Internal Server Error at Object.throw (/home/dapp_tx/node_modules/koa/lib/context.js:97:11) at setTx (/home/dapp_tx/src/api/eth/eth.controller.js:105:18) at runNextTicks (internal/process/task_queues.js:60:5) at listOnTimeout (internal/timers.js:524:9) at processTimers (internal/timers.js:498:7) at async bodyParser (/home/dapp_tx/node_modules/koa-bodyparser/index.js:86:5)
제가 웹 지식이 없다보니 이미지 데이터 다운로드 부분에서 혼란이 옵니다. 앱 같은 경우는 DB에 저장되어 있는 이미지가 저장된 url을 클라이언트에게 보내주고 클라이언트가 해당 이미지를 로딩하는 방식을 많이 사용하는 걸로 알고 있습니다. 영한님이 설명해주시는 것을 보면, http header와 함께 이미지 데이터도 바이트코드로 같이 보내주는 것처럼 들리는데 웹 브라우저에게 데이터를 줄 때는 앱과 다른 방식으로 보내는 건가요?
SpringConfig에서 문제가 있는데 이유가 뭔지 모르겠습니다! Could not autowire. There is more than one bean of 'MemberRepository' type.Beans:memoryMemberRepository (MemoryMemberRepository.java)springDataJpaMemberRepository (SpringDataJpaMemberRepository.java)
PDF 88쪽은 이와 같이 'saveItem(item);'이라는 코드가 없어서 영속화가 안 되고 이와 같이 'saveItem(item);'을 적어줘야 영속화가 되는 것 같습니다. PDF 자료의 오류인지, 제가 뭔가 다른 곳에서 착각을 한 건진 모르겠지만 혹시나 해서 적어봅니다~
안녕하세요. 너무 좋은 강의 잘 듣고있습니다 !! :) 강의 마지막부분에서 가장 좋은 방법이라고 말씀해주신대로, Service 계층에 ItemUpdateDto 를 추가하고, 엔티티 클래스에 update() 함수도 만들어서 구현을 했습니다. 여기서 한 가지 궁금한점이 생겼는데요, - price >= 0 - stockQuantity >= 0 - name 은 빈 문자열이 아님(StringUtils.hasText == true) 등의 조건을 검사하여 exeception 을 날리거나, update 를 진행하고 싶을 때 조건검사를 어디서 하는 것이 가장 좋은지 고민이 됩니다. 제 생각에는 크게 세가지 방법이 있을 것 같은데요.. 1. Controller 에서 검사하여, 검증된 값만 DTO에 담아서 service 에 전달한다. 2. service 에서 엔티티의 update() 함수를 호출하기전에 검사한다. 3. 엔티티 클래스의 update() 함수 내부에서 검사한다. 세 가지 방법에대해 제가 고민해본 내용을 말씀드리면.. Book 클래스의 removeStock() 처럼 엔티티 내부에서 검사하고, NotEnoughStockException 같은 에러를 날리는 비지니스 로직을 넣어야할까요? (코드에 일관성이 있도록..) --> 3번 그런데, Controller 에서 미리 검사를 하면 굳이 service -> repository 를 타고 내려가서 select 쿼리를 날릴 필요가 없어지기 때문에 성능상 유리할 것 같다는 생각도 듭니다. --> 1번 두 군데에서 다 검사를 하는 것이 좋을까요? 실무에서는 보통 어떤 방법을 채택하는지 궁금합니다 .
안녕하십니까 선생님 해당 '다양한 의존관계 주입 방법' 강의에서 강사님이 setter주입은 단계가 나눠져있고, 생성자 의존관계 주입은 빈을 등록하면서 의존관계 주입이 동시에 일어난다고 말씀해주셨습니다. 단계로 나눈다는 말씀은 빈을 등록하고, 의존관계 주입을 할 때, 컨테이너에서 빈을 조회하여 주입시킨다. 이 부분은 이해가 됩니다. 그런데 제가 이걸 강의를 두 번째 들으면서 너무 깊이 생각한건지 만약에 OrderServiceImpl을 빈으로 등록할 때, 자동으로 의존관계 주입이 일어난다고 하시지 않으셨습니까? 그러면 MemberRepository와 DiscountPolicy가 아직 빈에 등록이 안될 경우가 있나요?? 이럴 경우에 어떻게 실행과정이 이뤄지는지 궁금하여 QnA를 찾아보았습니다. https://www.inflearn.com/questions/89770 위의 답변을 보고 제가 이해한 내용은 빈 등록과 의존관계 주입이 동시에 일어나게 될 때, 1. MemberRepository가 아직 빈에 등록되지 않으면 스프링은 위의 빈을 찾아 등록하고 OrderServiceImpl의 의존관계 주입에 사용 2. DiscountPolicy도 1번과 같이 실행이 된다. 라고 생각하면 될까요?? 결국에는 setter 주입은 단계가 나눠지고, 생성자 의존관계 주입은 동시에 일어난다 이렇게 구분지어 말씀하신게 이해를 쉽게 하기 위해서 강의하신건지,, 아니면 setter주입과 생성자 주입에 상관없이 1,2번 처럼 되는지 궁금합니다. ------------------------------------------------ 14:33에 말씀하시는 생성자에서 의존관계 주입할 때 생성자 파라미터를 가리키시면서 가급적 필수값이라고 말씀하셨는데 인자가 필수라는 말씀이신건지, 객체가 무조건 있다는 말씀이신지 궁금합니다! ------------------------------------------------- setter주입은 선택, 변경 생성자 주입은 불변, 필수 라고 말씀하셨습니다. setter주입은 setXXX 메서드를 통하여 변경할 수 있고, 파라미터마다 setXXX를 만들면 선택적으로 주입할 수 있다.라고 생각이 들어 선택, 변경은 이해가 됐습니다. 생성자 주입은 생성자가 1번 호출 되는 것이 보장되기 때문에 불변도 이해가 됐습니다. 그러나 필수 이 부분은 어느 부분때문에 필수라고 말할 수 있는지 궁금합니다!! 긴 글 읽어주셔서 감사합니다.
공부하다가 이해가 안되는게 있어서 남겨봅니다. 만약 post API가 다음과 같은 RequestBody를 받도록 설계하고 싶다고 가정해보겠습니다. // Item entity { "name": "string", "type": "string", "count": 999, "infoList": ["aaa", "bbb", "cc"], "remark": "string" } 질문 1. 강의를 통해 배운 방법으로 infoList를 만든다면 Info Entity를 별도로 만든 다음 Item과 Info를 Join하는 방법이 있을 것입니다. 그런데 info는 문자열만 있으면 되기 때문에 굳이 뎁스가 있게 구성하고 싶지 않았습니다. Info entity 없이 단순히 Item 엔티티에 배열만 넣는 방식은 무엇이 있을까요? @ElementCollection가 있다는 것은 아는데 이것만으로도 충분한지 궁금해서 질문을 남겨봅니다. 질문 2. 만약 Info entity를 만든다고 가정하고... 위 json처럼 리스트에는 문자열만 넣을 수 있을까요? @JsonUnwrapped라는 것이 있길래 이것으로 가능할까 궁금해서 질문을 남깁니다.
``` let req , res , next ; beforeEach (() => { req = createRequest () ; res = createResponse () ; next = null ; }) ; ``` beforeEach 강의 에서 전역 컨텍스트에 대해 위 코드처럼 하라고 말씀해주셨는데, 특정 describe 안에서만 공유 되는 값에 어떤 동작을 해야할 땐 beforeEach를 사용해야 하지만 위 코드처럼 단순히 '모든 테스트에서 공유해야 하는 값' 을 정의하는건 ``` const req = createRequest () ; const res = createResponse () ; const next = null ; ``` 그냥 이렇게 상수로 정의하면 되지 않나요? beforeEach를 사용해야만 하는 이유가 있는지 궁금해서 질문드려요. 좋은 강의 잘 보고 있습니다 감사합니다.