일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 스프링 핵심 기능
- db
- 그리디
- 스프링 핵심 원리
- SpringBoot
- 자바
- Android
- JPQL
- jpa
- QueryDSL
- 알고리즘
- AOP
- Exception
- 김영한
- JDBC
- http
- springdatajpa
- spring
- kotlin
- 백준
- Thymeleaf
- transaction
- java
- Spring Boot
- Servlet
- Proxy
- Greedy
- 인프런
- pointcut
- 스프링
- Today
- Total
목록session (11)
개발자되기 프로젝트
기본 데이터 입력 set autocommit true; delete from member; insert into member(member_id, money) values ('memberA',10000); lock 0 lock 1 - 세션1 set autocommit false; update member set money=500 where member_id = 'memberA'; 세션1이 트랜잭션을 시작하고, memberA 의 데이터를 500원으로 업데이트 했다. 아직 커밋은 하지 않았다. memberA 로우의 락은 세션1이 가지게 된다. lock 2 - 세션 2 SET LOCK_TIMEOUT 60000; set autocommit false; update member set money=1000 where..
트랜잭션 사용법(구체적인 실제 구현은 DB마다 다름.) 데이터 변경 쿼리를 실행하고 데이터베이스에 그 결과를 반영하려면 커밋 명령어인 commit 을 호출하고, 결과를 반영하고 싶지 않으면 롤백 명령어인 rollback 을 호출하면 된다. 커밋을 호출하기 전까지는 임시로 데이터를 저장하는 것이다. 따라서 해당 트랜잭션을 시작한 세션(사용자) 에게만 변경 데이터가 보이고 다른 세션(사용자)에게는 변경 데이터가 보이지 않는다. 등록, 수정, 삭제 모두 같은 원리로 동작한다. 앞으로는 등록, 수정, 삭제를 간단히 변경이라는 단어로 표현 1. 기본 데이터 세션1, 세션2 둘다 가운데 있는 기본 테이블을 조회하면 해당 데이터가 그대로 조회된다. 2. 세션1에서 데이터 추가 세션1은 트랜잭션을 시작하고 신규 회원1..
데이터베이스 연결 구조1 사용자는 웹 애플리케이션 서버(WAS)나 DB 접근 툴 같은 클라이언트를 사용해서 데이터베이스 서버에 접근 클라이언트는 데이터베이스 서버에 연결을 요청하고 커넥션을 맺게 된다. 이때 데이터베이스 서버는 내부에 세션이라는 것을 만든다. 그리고 앞으로 해당 커넥션을 통한 모든 요청은 이 세션을 통해서 실행하게 된다. 쉽게 이야기해서 개발자가 클라이언트를 통해 SQL을 전달하면 현재 커넥션에 연결된 세션이 SQL을 실행한다. 세션은 트랜잭션을 시작하고, 커밋 또는 롤백을 통해 트랜잭션을 종료한다. 그리고 이후에 새로운 트랜잭션을 다시 시작할 수 있다. 사용자가 커넥션을 닫거나, 또는 DBA(DB 관리자)가 세션을 강제로 종료하면 세션은 종료된다. 데이터베이스 연결 구조2 커넥션 풀이 ..
1. 현상 현재 로그아웃을 시도하면 화면이 바뀌지 않는다. 아래와 같이 로그아웃을 클릭하면 logcalhost:8080/logout 으로 접속하고 session이 있는 경우 session을 만료시킨다. 이후 localhost:8080/으로 redirect된다. 이때 localhost:8080/ 접속 시 세션에 로그인 회원에 대한 정보가 없으면 home.html 정보가 있으면 loginHome.html을 뿌려준다. 하지만 로그아웃을 시도해도 뷰가 변경되지 않는다.. 2. 원인 분석 localhost:8080/ 접속 시 처리하는 로직 중 세션 유뷰 확인 이후에 현재 세션에 담긴 정보를 찍어보자. 만약 로그아웃 시도 후 위에 작성한 로그가 남는다면, 세션 만료 처리가 되지 않아 발생하는 문제이다. 2021-1..
RequestMapping Handler Adapter 구조 HTTP 메시지 컨버터는 SpringMVC 어디 쯤? 에서 사용됨....? 1. SpringMVC 구조 @RequestMapping을 처리하는 핸들러 Adapter인 RequestMappingHandlerAdapter에서 처리함. 2. RequestMappingHandlerAdapter 동작.. bsh-developer.tistory.com 1. @Login annotation을 직접 만들자? 기존에는 @SessionAttribute()를 Member에 붙여서 Member와 관련있는 Session을 편하게 사용하였다. @SessionAttribute()는 request에서 session을 꺼내주고 쿠키까지 찾아준다. 충분히 편리하다. // @G..
Servlet은 HTTP Session기능 제공. 1. HttpSession 서블릿이 제공하는 HttpSession 도 앞서 만든 SessionManager 와 같은 방식으로 동작 서블릿을 통해 HttpSession 을 생성하면 다음과 같은 쿠키를 생성 쿠키 이름이 JSESSIONID 이고, 값은 추정 불가능한 랜덤 값이다. Cookie: JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05 HttpSession은 attribute(member정보), 쿠키 이름, 기타 정보(생성 시각, 마지막 요청 시각 등) 를 포함하는 객체. HttpServletRequest에서 httpRequest.getSession()을 통해 받을 수 있음. 2. HttpSession 사용 2.1 Sess..
기존에 사용된 쿠키 방식을 session으로 변경해보자. 1. LoginController loginV2() @PostMapping("/login") public String loginV2(@Validated @ModelAttribute("loginForm") LoginForm form, BindingResult bindingResult, HttpServletResponse response){ if(bindingResult.hasErrors()){ return "login/loginForm"; } Member loginMember = loginService.login(form.getLoginId(), form.getPassword()); if(loginMember == null){ bindingResul..
1. 세션 관리가 제공하는 기능 세션 생성 sessionId 생성 (임의의 추정 불가능한 랜덤 값) 세션 저장소에 sessionId와 보관할 값 저장 sessionId로 응답 쿠키를 생성해서 클라이언트에 전달 세션 조회 클라이언트가 요청한 sessionId 쿠키의 값으로, 세션 저장소에 보관한 값 조회 세션 만료 클라이언트가 요청한 sessionId 쿠키의 값으로, 세션 저장소에 보관한 sessionId와 값 제거 2. SessionManager 생성 cookie 이름은 항상 "mySessionId"임 -> 상수로 만듦 : "SESSION_COOKIE_NAME" session은 메모리에 저장하고, 동시성 문제로 인해 ConcurrentHashMap 사용 package hello.login.web.sess..