[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요. 스프링 MVC 2편 - 섹션6. 로그인 처리1 중 로그인 기능 강의를 수강하다가 구현 방법에 대해 궁금한 점이 생겨 질문 드립니다. 강의 3:49초 부분에서 로그인 핵심 비즈니스 로직을 2단계의 과정으로 나누고 이를 코드로 작성하는 것을 학습했습니다. 입력 받은 loginId와 일치하는 회원 정보가 있는 지 DB에서 조회한다 loginId로 DB에서 조회한 회원 정보의 password와 입력 받은 password를 비교하여, 일치하는 회원 정보를 찾는다 public Member login(String loginId, String password) { return memberRepository.findByLoginId(loginId) .filter(m -> m.getPassword().equals(password)) .orElse(null); } 강의의 로직은 잘 이해하였지만, 일종의 원 쿼리 라고 부르는 방식으로, 한 번에 해결할 수 있을텐데 , 왜 2단계로 나누어 해결하는 지 이유 가 궁금합니다. 강의에서는 메모리를 DB로 사용했지만 일반적인 DB를 사용한다고 가정했을 때, 제가 생각한 방법 은 MemberRepository에 public Optional findByLoginIdAndPassword(String loginId, String password) 메서드를 정의하고 loginId와 password가 모두 일치하는 (AND 조건) 회원 정보가 있으면, 그 회원 정보(Member)를 반환 일치하는 회원 정보가 없으면 null 반환 LoginService에서 리포지토리의 findByLoginIdAndPassword 를 호출하기만 하면 되지않을까 생각했습니다. public Member login(String loginId, String password){ return memberRepository.findByLoginIdAndPassword(loginId, password); } 이렇게 생각한 이유 는 입력한 정보와 일치하는 데이터가 DB에 있는 지 확인하기 위해 어차피 DB에 접근이 필요한 상황이고, 그렇다면 자바에서 루프를 돌면서 비교하는 것보다 DB에서 WHERE 절을 통해 조건을 비교하는 것이 빠르지 않을까 싶어서 입니다. 정답이 있는 건 아니겠지만, 영한님께서 로직을 2단계로 나누어 작성하신 데에는 이유가 있을 것이라 생각해서, 그 이유가 궁금합니다. 저는 SI에서 근무를 했었는데, 비즈니스 로직을 모두 쿼리에 녹여내고, 대부분을 원 쿼리로 해결하는 방식의 개발 방법을 익혔었습니다. 영한님 강의를 들으면서 이게 좋지 않은 방법이란 것을 알게 되었고, 보다 객체지향적으로 설계하고 개발할 수 있도록 노력하고 있습니다. 그래서 로그인 로직에서도 원 쿼리보다는, 강의에서와 같이 2단계로 작성하는 것이 더 좋은 방법인 건지 궁금합니다. 긴 질문 읽어주셔서 감사합니다. ^^
안녕하세요 강사님! Spring MVC 구조에 대해 공부하다가 궁금한 것이 있어서 질문드립니다. DispatcherServlet에서 핸들러 어댑터를 호출하고 핸들러 어댑터에서 저희가 구현한 핸들러(컨트롤러)를 호출해서 사용하는데 여기서 '스프링 프레임워크에서 사용자가 구현한 코드를 호출한다.' 라는 관점으로 보았을 때 IoC 개념이 적용되었다고 봐도 될까요?
안녕하세요 매번 강의 잘 듣고 있습니다. 8번 퀴즈를 풀면서 궁금한게 생겨 글써봅니다. 앞선 Interface 강의에서는 FactoryCam 의 객체를 만들었을때 FactoryCam factoryCam = new FactoryCam(); factoryCam.setDetector(advancedFireDetector); factoryCam.setReporter(videoReporter); factoryCam.detect(); factoryCam.report(); setDetector() 와 setReporter() 의 인수로 위에서 정의한 Reportable videoReporter = new VideoReporter(); Detectable advancedFireDetector = new AdvancedFireDetector(); 두 객체를 지정하셨는데 퀴즈 8번에서는 이렇게 인스턴스 객체를 만들고 인수에 집어넣는게 아닌 SpeedCam speedCam = new SpeedCam(); speedCam.setDetector(new AccidentDetector()); speedCam.setReporter(new VideoReporter()); new AccidentDetector() , new VideoReporter() 인스턴스를 바로 인수로 집어넣는것이 import 만 쓰면 가능하다는걸 보여주시려고 작성한건지 궁금해서 여쭤봅니다. 1회차로 강의를 보는중이라 기본적인 용어의 혼동이나 이전 강의들의 개념도 아직 제대로 정립되지않아 질문하기를 망설였지만 답변받으면서 얻는 정보도 있을거라 생각하여 질문드려봅니다.
hashMap에서는 값이 저장되는 순서가 보장이 되지 않는 다고 알고 있습니다. Map인터페이스의 values()메서드 또한 맵에 저장된 값들을 반환하지만 순서가 유지되지 않는 다고 알고 있는데요 그런데 전체 클래스 테스트시 findAll(), findByName(),save()순으로 실행이 되는 데 findAll()과 findByName() 에서 각 멤버 인스턴들이 save가 다 되고 난 후 System.out.println(repository.findAll());추가해 이를 통해 저장된 값들을 확인해 본 결과 findAll()의 System.out.println(repository.findAll()); 에서는 [hello.hellospring.domain.Member@589b3632, hello.hellospring.domain.Member@45f45fa1] findAll()이후에 실행된 findByName()의 System.out.println(repository.findAll()); 에서는 [hello.hellospring.domain.Member@589b3632, hello.hellospring.domain.Member@45f45fa1, hello.hellospring.domain.Member@67a20f67, hello.hellospring.Member@57c758ac] 값이 나왔는데 이 처럼 메소드가 실행된 순서와 각 인스턴스들이 save된대로 저장값의 순서 유지가 되서 출력값으로 나오는데 원래라면 hashMap과 values()메서드가 저장 순서를 보장하지 않으므로 System.out.println(repository.findAll()); 실행시 마다 Map에 저장된 값들을 저장순서 상관없이 랜덤하게 출력되야 되는 거 아닌가요? 제가 어떤 부분을 잘못알고 있는 지 궁금합니다. class MemoryMemberRepositoryTest { MemoryMemberRepository repository = new MemoryMemberRepository(); @Test public void save(){ Member member = new Member(); member.setName("spring"); repository.save (member); Member result = repository.findById(member.getId()).get(); assertThat(member).isEqualTo(result); } @Test public void findByName(){ Member member1 = new Member(); member1.setName("spring1"); repository.save (member1); Member member2 = new Member(); member2.setName("spring2"); repository.save (member2); Member result = repository.findByName("spring1").get(); System.out.println(repository.findAll()); assertThat(result).isEqualTo(member1); } @Test public void findAll(){ Member member1 = new Member(); member1.setName("spring1"); repository.save (member1); //hashMap 함수로 key로 id value로 member(id,name) 인스터스 저장 Member member2 = new Member(); member2.setName("spring2"); repository.save (member2); List<Member> result = repository.findAll(); System.out.println(repository.findAll()); assertThat(result.size()).isEqualTo(2); } }
안녕하세요 선생님, 질문들이 조금 많아 정리해서 여쭙고 싶습니다. One to One은 수학에서의 '일대일 함수'와 같은 개념으로 이해했슨데, ONTO의 경우 수학에서의 '일대일 대응'과는 다른 의미인가요? One to One은 서로 다른 x에 대해 무조건 서로 다른 image가 대응되어야 한다고 알고 있습니다. 다만 ONTO는 단지 codomain과 range가 (공역 = 치역) 같아야 한다고 알고 있는데, 혹시 ONTO도 '일대일대응'과 같이 '공역 = 치역' 이라는 조건과 동시에 '일대일 함수'의 조건 또한 만족해야 하나요? 아니면 단지 공역 = 치역 이기만 하면 되는건가요? ONTO와 One to One을 구별하는 방법 중에 ONTO의 경우 각 Row 마다 pivot이 존재해야 하므로: 행 개수 < 열 개수인 가로로 긴 행렬 One to One의 경우 각 Column마다 pivot이 존재해야 하므로: 행 개수 > 열 개수인 세로로 긴 행렬 라는 것을 교재에 수록된 문제 솔루션에서 봤습니다. 이렇게 이해해도 되는건가요? 만약 된다면, Row마다 pivot / Column마다 pivot이 존재해야 한다는 뜻을 정확히 모르겠습니다. 이를 어떻게 다른 조건과 동치로 해석해야 하나요? 그리고 맞을 경우에, 행 개수 = 열 개수인 정사각행렬은 ONTO인지 One to One인지 어떻게 판단하나요? ONTO를 판단하는데 있어서, Columns of A가 R^{m} space를 span하는 것이 필충조건이라고 배웠습니다. 그런데 Theroem 4 - (d)에서 A가 각 Row 마다 pivot position이 존재하는 것과 동치라고 알고있습니다. 이는 [0 0 0 ... 0 b]와 같은 행이 존재하지 않는다는 의미인데요, T와 같은 standard matrix의 경우 coefficient matrix이기 때문에 [0 0 0 ... 0 b] 가 아니라 [0 0 0 ... 0 ]의 형태로 b가 빠지는 것으로 알고 있습니다. 그렇기 때문에 저는 이를 영행 으로 판단하고 ONTO의 필요충분 조건은 '영행이 없기만 하면 된다'라고 판단했는데 혹 이렇게 판별해도 문제가 있을까요? 선생님, 강의가 공부하는데 정말 큰 힘이 되고 있습니다. 긴 질문글 다 읽어주셔서 정말 감사합니다! 날씨도 더운데 고생 많으십니다 ㅜㅜ
다음과 같은 양식으로 남겨주세요. 질문을 한 배경 : 배포목록에 netlify가 없어요. 질문내용 : codeSandbox에서 react 키워드가 들어간 모든 템플릿을 찾아봤는데, netlify가 나오지 않습니다. 앞서 2분이 동일한 내용으로 글 작성해주신 걸로 아는데, 어떻게 정리가 된 걸까요?
이렇게 뜨면서 안되네요 ...... . 9월 16, 2023 4:43:21 오후 org.apache.catalina.core.StandardWrapperValve invoke 심각: 경로 [/MVC01]의 컨텍스트 내의 서블릿 [kr.bit.controller.MemberInsertController]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [not insert]을(를) 발생시켰습니다. javax.servlet.ServletException: not insert at kr.bit.controller.MemberInsertController.service( MemberInsertController.java:49 ) at javax.servlet.http.HttpServlet.service( HttpServlet.java:741 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter( ApplicationFilterChain.java:231 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter( ApplicationFilterChain.java:166 ) at org.apache.tomcat.websocket.server.WsFilter.doFilter( WsFilter.java:52 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter( ApplicationFilterChain.java:193 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter( ApplicationFilterChain.java:166 ) at org.apache.catalina.core.StandardWrapperValve.invoke( StandardWrapperValve.java:199 ) at org.apache.catalina.core.StandardContextValve.invoke( StandardContextValve.java:96 ) at org.apache.catalina.authenticator.AuthenticatorBase.invoke( AuthenticatorBase.java:543 ) at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:139 ) at org.apache.catalina.valves.ErrorReportValve.invoke( ErrorReportValve.java:81 ) at org.apache.catalina.valves.AbstractAccessLogValve.invoke( AbstractAccessLogValve.java:678 ) at org.apache.catalina.core.StandardEngineValve.invoke( StandardEngineValve.java:87 ) at org.apache.catalina.connector.CoyoteAdapter.service( CoyoteAdapter.java:343 ) at org.apache.coyote.http11.Http11Processor.service( Http11Processor.java:609 ) at org.apache.coyote.AbstractProcessorLight.process( AbstractProcessorLight.java:65 ) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process( AbstractProtocol.java:810 ) at org.apache.tomcat.util.net .NioEndpoint$SocketProcessor.doRun( NioEndpoint.java:1623 ) at org.apache.tomcat.util.net.SocketProcessorBase.run ( SocketProcessorBase.java:49 ) at java.util.concurrent.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1149 ) at java.util.concurrent.ThreadPoolExecutor$Worker.run( ThreadPoolExecutor.java:624 ) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run( TaskThread.java:61 ) at java.lang.Thread.run ( Thread.java:748 ) 너무 답답해요 ㅠㅠㅠㅠ
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
중급반 섹션6 <Dio onError Interceptor 작업하기>강의 8분 정도에 onError작업하는 과정에서 에러사항 처리하는 과정에서 refresh토큰으로 accessToken 요청경로가 아래 같은 경로로 설정하셨는데, final isPathRefresh = err.requestOptions.path == '/auth/token'; restaurnatRepository 에서 baseUrl을 이렇게 설정하셨는데 강의처럼 설정하면 http로 시작안하면 baseUrl이 온다고 나와있어서 'http://$ip/restaurant' /// If the `path` starts with 'http(s)', the `baseURL` will be ignored, otherwise, /// it will be combined and then resolved with the baseUrl. 'http://$ip/restaurant/auth/token'이 이렇게 되는게 아닌지 궁금합니다. +그리고 Riverpod pdf자료 추가 안되어있는거 같은데 이것도 확인한번부탁드릴게요~ㅎ
WSL2 환경에서 자바를 설치하고 컨슈머 프로듀서 예제를 설명하신 AtomicBoolean으로 flag값을 그리고 turn을 static 영역에 할당하고 컨슈머 프로듀서의 잡을 각기 다른 두 개의 쓰레드로 실행시켰습니다 turn이나 flag값이 클럭단위로 문맥교환하는 경우를 가정해서 뜯어보며 경우의 수를 따져봤지만 딱히 문제되는 경우는 없어보였습니다 while의 조건문을 고려해도 딱히 문제는 없어보였구요 그런데 count값은 이상하게도 0이 항시적으로 나오지 않았고 예상된 값을 벗어났습니다 리눅스라 에러가 생기는건가 싶지만 JVM에서 가동되는 환경이라 딱히 다를것은 없다고 생각했고 실제로도 윈도우즈 환경에서도 똑같은 동시성문제가 발생했습니다 도대체 무엇이 문제일까요