New Project
의존성 추가
(오류 : 현재 kakao 폴더 바깥에 전부 생성해놓았음. 아래 파일 전부 kakao 폴더 안으로 수정할 것. )
StandardController 생성
ISystemMapper
SystemService
_error.html 생성
언더스코어를 붙이는 이유는
공용으로 이용하는 것이기 때문. 특정 맵핑을 위해 존재하는 것이 아닌 여기저기서 다 땡겨쓸거라는 이야기.
StandardController 에서 SystemService연결하고handleException 메서드 생성.
이미지에는 넣지 않았지만 @Controller 어노테이션 밑 @RequestMapping(value = "/") 추가
테스트 결과 Exception 핸들러에는 ModelAndView를 넣어도 객체화를 해주지 않는다. 그래서 수동으로.
그리고 오류가 핸들되었다 하더라고 그 이후에는 무슨 오류가 났는지 우리가 해결해야 하니 exception.printStackTrace(); 해주자.
그리고 protected final로 지정하여 더 이상 재정의 할 수 없도록 만든다.
깜빡한 의존성 하나 더 추가.
_error연결 완료
RootController
templates안에 root디렉토리 만들고 index.html 생성
daemon.kakao 라는 새로운 계정 생성. 모든 권한 부여.
(터미널로 하였음)
application.properties
error_logs 테이블 생성
긴 이름 방지 위해 entities에 system 패키지 또 만들고
ErrorLogEntity 생성. 게터세터 생성.
ISystemMapper에 메서드 추가 후
SystemService에서 불러옴
resources에 mappers 디렉토리 만들고
SystemMapper.xml에서
IFNULL
: createdAt이 null이면 이 자리에는 default 값이 들어간다.created_at 열에 default값이 들어감. created_at의 기본값은 NOW(6).
정리하자면 createdAt이 null이면 뒤에꺼를 쓴다는게 IFNULL 함수의 역할이고, default는 전달된 열의 기본값을 사용한다. 즉 NOW(6)가 이 자리에 들어온다라는 뜻.
DATETIME(6)
: SELECT NOW(3); 을 하면 millisecond 단위까지 나오고, SELECT NOW(6); 을 하면 microsecond 단위까지 현재 시간이 나온다.
테이블 생성할때 컬럼을 DATETIME(6) 으로 지정해야지 microsecond 단위까지 저장된다.
StandardController
createdAt을 안해도된다. 그냥 NULL로 두면 현재 시간이 들어간다.
clientUa같은 경우는 null이 나올 수도 있기 때문에 따로 빼준다.
디비 추가
statuses code. 회원 상태를 아래로 명시할 것
DELETED
EMAIL
NORMAL
SUSPENDED
entities 안에 member 패키지 만들고 UserEntity 추가
session을 담당하는 테이블 추가.
중복 로그인 방지가 목적.
SessionEntity 추가. 게터세터 추가
디비 구축.
contact_companies
contact_firsts
genders
statuses
@SessionAttributes(이름) {class} : 정해준 이름으로 Model에 객체가 추가될 경우 실제로 Model이 아닌 세션에 저장한다.
(HttpSession을 컨트롤러에서 쓰지 않겠다는 말)
@SessionAttribute {variable} : 세션 저장소에서 객체를 받아온다.
(세션에다 저장한 오브젝트를 받아올 때 쓴다.)
@ModelAttribute {variable, method} : 모델 저장소에서 객체를 받아온다.
이 어노테이션이 있으면 불러올 때 값이 없으면 오류가 나지 않고 null을 준다.
UserEntity 에서
public static final String ATTRIBUTE_NAME = "userEntity";
만들고
StandardController 에 SessionAttributes 추가
root에 html 2개 수정,생성 후
unsigned.html 내용에 로그인!이라 적어두고
RootController 내용 추가
( 세션 저장소에서 객체를 받아온다. )
그 위치는 StandardController 에 추가한 SessionAttributes에서 가져오는 것.
로그인하였을 때와 하지 않았을 때, 동일한 주소에서 다른 페이지를 보여줄 것이다.
UserEntity가 null이면 unsigned.html로 연결
static에 images 디렉토리 만들고 외부 이미지 파일 소스 추가.
static에 stylesheets 디렉토리 만들고
css 2개 생성
unsigned.html 에 내용 넣고
common.css 내용 추가
index.css 내용 추가
@SessionAttributes
- 해당 컨트롤러 내에서만 동작.
- 즉, 해당 컨트롤러 안에서 다루는 특정 모델 객체를 세션에 넣고 공유할 때 사용.
- 모델(Model) 정보를 HTTP 세션에 저장해주는 애노테이션입니다.
HttpSession을 직접 사용할 수도 있지만
이 애노테이션에 설정한 이름에 해당하는 모델 정보를 자동으로 세션에 넣어줍니다.- @ModelAttribute는 세션에 있는 데이터도 바인딩합니다.
- 여러 화면(또는 요청)에서 사용해야 하는 객체를 공유할 때 사용합니다.
ex) 장바구니, 여러 화면에 걸쳐 나눠진 회원가입 등- 또한 @SessionAttributes를 사용하면 @ModelAttribute OR model.addAttribute()를 활용하여 객체를 저장할 경우
세션에 저장이 되도록 지정할 수 있습니다.
( * 이러한 경우에는 세션이 제거되거나 SessionStatus 객체를 사용하여 명시적으로 지울때까지 동일한 세션에는 계속 사용할 수 있습니다.)-장점
-직접 세션 객체에 (setAttribute(), getAttribute() 메서드를 사용하여 작업을 할 수 있지만, @ModelAttribute가 세션에 객체를 저장하고, 찾도록 한정할 수 있다는 장점이 있습니다.
또한 @ModelAttribute와 같이 사용해서 세션 객체에 넣고 빼는 작업을 숨겨주고 스프링 form 태그와 연동되어 폼에 값을 넣는 작업도 단순화 되는 장점이 있습니다.)
@SessionAttribute
- 컨트롤러 밖(인터셉터 또는 필터 등)에서 만들어 준 세션 데이터에 접근할 때 사용한다.