/** * 세션 관리 매니저 */ @Component public class SessionManager { public static final String SESSION_COOKIE_NAME = "mySessionId"; private final Map<String, Object> sessionStore = new ConcurrentHashMap<>(); /** * 세션 생성 * * @param value 저장할 값 * @param resp HTTP Servlet Response */ public void createSession( Object value, HttpServletResponse resp ) { // 세션 ID를 생성하고, 값을 세션에 저장 String sessionId = UUID.randomUUID().toString(); sessionStore.put(sessionId, value); // 쿠키 생성 Cookie mySessionCookie = new Cookie(SESSION_COOKIE_NAME, sessionId); resp.addCookie(mySessionCookie); } /** * 세션 조회 * * @param req HTTP Servlet Request * @return 조회된 세션에 대한 정보(값) */ public Object getSession( HttpServletRequest req ) { return findCookie(req, SESSION_COOKIE_NAME) .map(value -> sessionStore.get(value.getValue())) .orElse(null); } /** * 세션 만료 * * @param req HTTP Servlet Request */ public void expire( HttpServletRequest req ) { findCookie(req, SESSION_COOKIE_NAME) .ifPresent(cookie -> sessionStore.remove(cookie.getValue())); } /** * 쿠키 찾기 * * @param req HTTP Servlet Request * @param cookieName 찾을 쿠키 이름 * @return 찾은 쿠키 */ private Optional<Cookie> findCookie( HttpServletRequest req, String cookieName ) { if (req.getCookies() == null) { return Optional.empty(); } return Arrays.stream(req.getCookies()) .filter(cookie -> cookie.getName().equals(cookieName)) .findAny(); } } 지난 강의 시간에 Optional에 대해서 말씀하셨길래 SessionManager에 한 번 적용해 보았습니다. getSession 같이 외부로 나가는 것이 아닌, 클래스 내부에서만 사용할 수 있는 findCookie에 Optional을 사용하는게 적절한지 의문이 들어 질문남겨봅니다. Optional을 찾아보니, null을 반환할 수 있는 함수에 대해 사용할 수 있으며, 파라미터보다 반환값으로 사용하는게 맞다고 얘기를 하더군요. 그럼 반환값에 사용하면 위와 같이 ifPresent나 orElse를 이용해 실제 객체 값을 들고 와야하기도 해서, 지금처럼 간단한 로직에서는 굳이 Optional이 아닌, Cookie를 반환해서 if문을 이용해 null체크를 하는게 맞다고 생각은 합니다만.. findCookie는 클래스내부에서 사용하는게 적절하지 않다면, getSession같이 클래스 외부에서 사용할 수 있는 메서드에 대해 반환값을 Optional로 하는 것은 적절한 사용일까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] @JoinColumn(name="parent_id") 의 parent_id 는 어디서의 column을 의미하는건가요?? @Column(name="parent_id") 부분이 없는거 같은데 어디서 parent_id의 컬럼이 만들어져서 이것과 join을 하는건지 궁금합니다.
안녕하세요! 영한님 강의 정말 감사합니다! 궁금한게있어요! 그러면 Srping 에서 제공하는 트랜잭션이 default로 CGLIB 를 사용하는 것을 알겠습니다. 또한, 프록시 패턴을 통해서 inner method가 트랜잭션이 안탄다는것도 완벽 이해했습니다. ( self invocation ) 그럼 당연히 @Transactional public void a () { // logic innerMethod() } private void innerMethod() { } 와 같은 코드에서도 innerMetohd가 target 에 걸리는 바람에 트랜잭션이 끊기는 걸로 이해했는데요. 맞나요!?
안녕하세요 선생님 "Oxford Pet 데이터로 Train 실습" 강의를 참고하여 제 데이터로 실습을 진행해보고 있습니다. 저는 개인 gpu를 이용하기 위해서 vscode & jupyter notebook을 사용해서 코드를 작성 중입니다. config파일을 설정하고 train용 Dataset을 생성하려고 하는데 그림과 같은 메시지가 출력이 됩니다. ann_file에서 txt가 지원이 안된다는 말 같은데.. txt가 지원이 안되는 포맷이 아닌데 왜 이런 메시지가 뜨는지 어떻게 수정해야할지 잘 모르겠습니다. 조언 부탁드립니다. - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 강의 내용을 질문할 경우 몇분 몇초의 내용에 대한 것인지 반드시 기재 부탁드립니다. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요 Member 객체에 대하여 질문 있습니다. 테스트 코드의 경우 Member member = new Member(); 이런식으로 Member 인스턴스를 생성해서 member.setName("spring"); 이런식으로 쓰이는건 이해가 되는데요 Member 클래스 에서나 MemoryMemberRepository 에서나 따로 member라는 참조변수로 Member()라는 인스턴스(Member member = new Member();와 같은것들)를 생성하지 않았는데 바로 아랫줄에서 member.setId(++sequence);가 쓰일수 있는건지 궁금합니다.
설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
맛비님 안녕하세요 ! BRAM Ctrl 부분을 복습 도중 질문 사항이 생겨 글남기게 되었습니다. 강의와 다르게 비바도에서 직접 bram ip를 불러와서 테스트 벤치를 작성해보려고 했습니다. 이때 Total Port B Read Latency가 2 clock cycle 이라고 나와있습니다. 이 경우에 제가 PORT A에서 DATA를 받아 메모리에 쓰고 B에서 OUTPUT를 통해 출력을 읽는데 2 Clock에 latency가 걸린다고 이해하면 되는지 궁금합니다. (이것의 기준이 PORT A, B 의 clk가 같을때 얘기인지 궁금합니다.)
밑의 코드의 내부 for문에서 최악의 경우 연산이 arr.length-1 번 일어나기 때문에 시간 복잡도를 O(n^2)으로 봐야 할까요? function solution(m, arr) { let answer = 0, sum = 0; for (let i = 0; i < arr.length; i++) { sum = arr[i]; if (sum === m) { answer += 1; continue; } for (let j = i + 1; j < arr.length; j++) { sum += arr[j]; if (sum === m) { answer += 1; break; } else if (sum > m) { break; } } } return answer; }
여기서 1,2번을 정리한건데 맞는 지 확인 해주세요 1. URL을 입력한다. (클라이언트의 요청) 2. DNS 서버로 IP를 찾아내고 생략된 PORT는 scheme로 찾아낸다 . ⇒ DNS에서 IP주소를 획득하는 과정은 3way handshake가 발생하지 않는다. 3.웹 브라우저가 HTTP 요청 메시지를 생성 4.애플리케이션에서 SOCKET 라이브러리를 사용해서 지시 ⇒ "커넥션을 TCP/IP로 맺으세요.! " 라고 지시 ⇒TCP/IP계층에서 이전에 찾은 IP와 PORT 정보를 통해 3 way handshake 방식으로 서버와 연결 먼저 1)이과정이 맞게 생각하고 있는 건지 궁금하고 2)두번째는 다른분의 질문답변에서 3 hand shake를 하면 클라이언트와 서버 모두 서로 IP, PORT를 알게 된다 라고 되있던데 이말은 3 hand shake를 하기위해서는 클라이언트는 서버의 IP, PORT를 알고 있어야하고 3 hand shake 이후에 서버도 클라이언트의 IP, PORT를알게된다는 의미인가요? 그러면 이 수업에서는 DNS 서버로 IP를 찾고 URL(클라이언트의 요청)의 scheme에서 생략된 port를 찾았다 고 배웠는데 그럼 이 과정은 필수 과정인가요?? ( 3 hand shake를 사용하기위한 필수과정 인가요? 클라이언트와 서버가 연결하기위한 필수과정인가요?) 답변 주시면 정말 감사하겠습니다.
안녕하세요! 동적배열 강의관련 질문드립니다. 정적배열과 동적배열의 시간복잡도를 비교하는 표에서, 정적배열의 데이터 추가/삽입(insert_back/insert_at)이 이해가 안 되어 질문드립니다. 정적배열은 선언과 동시에 크기가 정해지는데, 이미 초기화가 된 상태에서 추가나 삽입은 안 되지 않나요? 혹시 크기만 선언된 비어있는 정적배열을 말하는건가 생각해보니, 비어있는거면 insert_at이나 delete_at을 할 때도 기존 데이터를 옮길 필요가 없으니 O(n)이 아니라 O(1)이지 않나싶어서 그건 아닌 것 같고, 아니면 크기보다 데이터가 덜 들어간 케이스에서 저런 시간복잡도가 나오는건가요? ㅠㅠ 그렇다면 저게 다 이해가 됩니다. 그런데 아무리 그래도 정적배열에서는 추가/삽입의 한계가 있지 않나요? 어떤 조건에서 저게 되는건지 알려주세요ㅠㅠ
스프링 부트없이 Spring 사용중인데 jsp로 작업했던 파일을 thymeleaf로 변경하기 위해 html파일도 만들고 suffix도 변경해주었는데 아래와 같은 에러가 나옵니다. No mapping for GET /WEB-INF/view/register.html jsp로 바꿔서 하면 잘되는데 suffix만 html로 바꾸면 페이지를 찾지를 못하네요ㅠㅠ 원래 thymeleaf가 spring boot에서만 사용가능한 것 일까요?
다름 아니라 dp를 걸 때 str,int 이 2개의 값으로만 dp를 거는데요. 그 해당 값을 얻을 수 있었던 경로(visited)도 dp에 포함되어야 하는거 아닌가요 ? 예를들면 str이 3이고 int가 3인 dp가 있을 때 (dp[3][3]) 해당 지점까지 가는 경로의 경우의 수가 여러가지 일테니 각 경우의 수마다 얻을 수 있는 max값이 달라지지 않나요? dp에 이 2가지 요소만 들어가도 되는 이유를 잘 모르겠습니당 ㅠㅠ ㅎㅎ
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
final homeUrl = Uri.parse(' https://blog.codefatory.ai '); homeUrl을 해당 변수를 사용하는 클래스 밖(상위)에서 선언하는건 어떤이유인가요? loadRequest()가 수행되는공간과 같은 공간에 위치시켰더니 'the instance member 'homeUrl' can't be accessed in an initializer. Try replacing the reference to the instance member with a different expression.' 이란 에러가 뜨더군요. 클래스 컨스트럭터 내에서 변수를 사용하려면 상위공간에 미리 선언해야만 하는것인가요? (이전 코드에선 web view위젯 안에서 homeUrl을 call했기에 webview위젯 밖에 선언되어있어서 괜찮았던거라고 이해해도되는걸까요? WebViewController controller = WebViewController() ..setJavaScriptMode( JavaScriptMode .unrestricted) ..loadRequest(homeUrl); 새로 등장한 이 코드에서 (..)은 찾아보니 cascade notation 이라는 문법이더군요. 맞다면 WebViewController controller = WebViewController(); controller.setJavaScriptMode( JavaScriptMode .unrestricted); controller.loadRequest(homeUrl); 과 같은 뜻일텐데 이 코드처럼 풀어서 쓰려하면' the name of a constructor must match the name of the enclosing class'라는 에러가 뜹니다. 이는 왜일까요?