안녕하세요, Brad입니다. 어제 오늘 새로 알게된 사실에 대해 정리해볼게요.
Content Length 오류 관련
미션을 수행하면서 클라이언트에서 Content Length 관련한 오류가 많았습니다. 그래서 전 처음에 제가 적어주는 Response Header의 내용 때문에 그런 오류가 발생하는 줄 알고 이후에 해결하기로 하고 넘겼습니다.
그런데 어제 Pobi에게 물어보면서 제가 코드를 잘못 짠 결과라는 것을 알게되었습니다.
Response의 body부분을 인스턴스 변수로 사용하다보니 생긴 문제였습니다.
200코드 Response 객체를 싱글턴으로 사용하고 있었습니다. 그런데 이 안에 인스턴스 변수로 body를 사용하다보니 여러 요청 간 간섭이 생겼던 것입니다. 스택영역에 저장되는 메서드와 지역변수와 달리 힙영역에 싱글턴으로 계속 살아있는 객체의 경우 그 인스턴스 변수가 공유되다보니 섞기게 되었습니다.
해결방안
- 싱글턴 구조를 없앤다.
- body부분을 지역변수로 만들고 return시킨다.
위 2가지 방법 중 싱글턴은 포기할 수 없었습니다. 왜냐하면 Response는 계속 쓰이는 객체이기 때문입니다. 결국은 이참에 객체를 따로 만들고 응답 보내는 부분을 모두 담고있는 객체를 하나 만들었습니다.
쿠키값에 있는 Java 객체 타입을 어떻게 알고있을까?
- 제가 쿠키와 세션에 대한 개념이 명확하지 않다보니 생긴 의문이었습니다.
- 쿠키로 전해주는 것은 SessionId 입니다. 세션ID에 대한 DB를 따로 만들고 여기에서 값들을 보관하는 것입니다.
- 세션의 구조는
Map<String, Map<String, Object>>
로 값들을 보관하고 key는 사용자 식별ID, Value는 보관하는 키와 값이 될 것입니다. - 보관하는 값은 Object타입이기 때문에 이후 받을 때 casting이 필요합니다!
회원가입 후 redirect하지 않으면 발생하는 문제
- '새로고침'하면 계속 다시 회원가입 요청이 발생하게 됩니다.
- 그렇기 때문에 redirect를 해줘야합니다!!
302의 Location에서 full주소 안 적고 '/index.html'처럼 요청Path만 적어도 될까요?
- 그렇게 해도 되더라구요!
- 이전까지 full로 다
StringBuilder
로 도메인IP, 포트번호까지append()
하며 적었는데 그럴 필요가 없었습니다.
'TIL' 카테고리의 다른 글
Intellij에서 디버깅 사용하기 (0) | 2019.02.24 |
---|---|
Today's Dev Notes(2019-02-07) (0) | 2019.02.07 |
서버 N대 성능개선 (0) | 2019.01.22 |
Today's Dev Notes(2019-01-20) (0) | 2019.01.20 |
Today's Dev Notes(2019-01-17) (0) | 2019.01.17 |