JSP

JSP_5강(MVC)

삼색이삼랑해 2022. 11. 1. 16:43

  Web 프로젝트 디자인 패턴 MVC 틀

Model - Data 처리용 => Model, ModelAndView, Dto 클래스

View - 화면 처리용 => jsp, thymeleaf, react 등 (HTML)

Controller - 서비스 제공 및 제어 => Service, Dao 클래스 등

 

서비스(기능) 처리 단계 = View(url) -> Controller -> Service -> Dao -> DB

이때 Dao는 Mybatis를 이용하기 때문에 Class가 아닌 Interface로 작성해준다.

 

참고) Interface란?

객체지향 특성인 추상화(Abstraction)을 제공하기 위한 코드 작성 방법으로,  메소드의 선언부만 작성한다.

 

인터페이스의 존재는 다중상속에 있다. 클래스를 이용해 다중상속을 할 경우 메소드의 출처가 모호해지는 등의 여러 문제가 발생해 자바에서는 다중상속을 지원하지 않는다. 그러나 다중상속의 이점을 이용하기 위해서 인터페이스를 지원하고 있다. 즉, 다른 클래스를 작성할 때 기본이 되는 틀을 제공해주면서 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미한다.

 

자바의 추상 클래스는 추상 메소드뿐만 아니라 생성자, 필드, 일반 메소드도 포함할 수 있지만, 인터페이스는 오로지 추상 메소드와 상수만 포함할 수 있다.

  연결

1. log4jdbc 활용

DB 연동 단계 = 드라이브 로드 -> 접속 수립 -> SQL 실행 및 결과 처리 -> 접속 종료

 

DB의 처리는 이런 식으로 단계를 거치지만 일반적인 로그는 DB 관련 처리에 대한 내용이 부족하다. 특히 Mybatis를 사용하면 실행된 SQL 커리문과 처리 결과에 대한 내용을 확인하기 어렵다. 따라서 log4jdbc로 DB 관련 내용을 남겨서 이후 조치에 활용하는 것이 좋다.

 

해당 라이브러리(dependency) 포함 : log4jdbc-log4j2

application.properties에 설정

 datasource.driver-class-name : net.sf.log4jdbc.sql.jdbcapi.DriverSpy
 datasource.url : jdbc:log4jdbc:mysql//localhost..

2. return "redirect:url" 

이 키워드는 view(jsp)의 이름이 아니라 동작을 지정하는 명령어가 된다. 'redirect:url'이 들어오면 url을 처리하는 컨트롤러의 해당 메소드로 이동하게 된다.

 

3. 리다이렉트 방식

데이터 전달은 request 객체를 사용하게 되는데, 리다이렉트 방식은 기존 request 객체를 지우고 새 request 객체를 생성하여 처리되므로 일방적인 방식으로 데이터를 전달할 수 없다. 즉, 한 번 사용하고 없어지는 휘발성 데이터가 되는 셈이다.

 

따라서 RedirectAttributes 객체를 사용한다는 것은 리다이렉트 방식일 때 임시적으로 데이터를 전달하는데 사용하는 객체를 사용한다는 의미이이다.

 

4. Mybatis mapper

Interface에 작성한 메소드가 'public String selectData(int num);'이라면

 

- id : Dao 메소드의 이름 => id="selectData"

- parametherType : Dao 메소드의 매개변수 타입 => parameterType="Integer"

- resultType : Dao 메소드의 반환 타입 => resultType="String"

 

Mapper에 작성한 SQL 쿼리문이 'SELECT strColumn FROM table_name WHERE m_key#{num}'이라면

- #{num} : 'num'은 Dao 메소드의 매개변수 이름 => 매개변수가 Dto인 경우 Dto 클래스의 멤버 변수 이름

                 #{변수명} => 변수가 String일 경우 ''를 자동으로 붙여주고, 변수가 int일 경우 ''를 붙이지 않음

- ${column_name} : 데이터 그대로 붙이며, String일 경우 자동으로 ''를 붙여주지 않음

                                검색 기능에 따라 컬럼명이 바뀌어야 하는 경우에 주로 사용

                                ex) SELECT * FROM table_name WHERE ${column_name} LIKE '%aa%'

  암호화

사용자가 입력한 비밀번호를 그대로(plain text) 저장하지 않고 보안을 위해 암호화(cypher text)하여 DB에 저장하는 것을 암호화라고 한다. Spring Security에서 제공하는 비밀번호 암호화 객체(BCryptPasswordEncoder)를 사용한다.

 

참고) Spring Security란?

프레임워크에서 제공하는 클래스 중 하나로 비밀번호를 암호화하는 데 사용할 수 있는 메소드를 가진 클래스이다.

자바 서버 개발을 위해 필요로 하는 인증, 권한 부여 및 기타 보안 기능을 제공한다.

 

BCryptPasswordEncoder class)

Spring Security가 제공하는 객체 중 하나로, BCrypt 해싱 함수(BCrypt hashing function)를 사용해 비밀번호를 인코딩해주는 메소드 및 사용자에 의해 제출된 비밀번호와 저장소에 저장되어 있는 비밀번호가 일치하는지 확인해주는 메소드를 제공한다. 이는 만약 비밀번호 데이터가 노출되더라도 유추 및 확인이 어렵도록 만들어준다.

 

메소드의 구성은 총 3가지가 있다.

  • encode("plain") : 입력한 문자열을 암호화 => 반환 타입은 String, 똑같은 문자열을 입력해도 해당 메소드를 통해 다른 인코딩된 문자열을 반환해줌
  • matched("plain", "cypher") : 두 값을 비교 => 제출된 인코딩 전의 비밀번호와 인코딩된 비밀번호의 일치 여부를 확인해줌 => plain 자리에는 일치 여부를 확인하고자 하는 인코딩되지 않은 비밀번호를, cypher 자리에는 인코딩된 비밀번호를 입력해줌
  • upgrade("plain") : 더 나은 보안을 위해 인코딩된 비밀번호를 한 번 더 암호화 => plain 자리에는 인코딩 필요 여부를 확인하고자 하는 인코딩된 비밀번호를 입력 => 반환 타입은 인코딩이 필요한 경우 true를, 아닌 경우 false를 반환

  Session(세션) 기반 로그인 유지

Session이란 웹 사이트에서 여러 페이지에 걸쳐 사용되는 데이터 저장 방법을 말한다. 클라이언트의 브라우저에서 해당 서버에 접속하면 Session이 생성되고(1인당 1개) 접속을 종료하거나 브라우저를 종료하면 Session은 제거된다.

일정 시간 유지가 가능하며, 기본 유효 시간은 30분, spring boot는 15분이다. 유효 시간은 설정할 수 있다.

 

인터넷 서비스의 특성상 로그인 처리는 한 페이지에서만 유효하다. 그러나 로그인 상태를 유지하려면 로그인 성공 정보를 모든 페이지에서 유지해야 한다. 이것이 세션을 사용하는 이유이다.

 

세션의 삭제(로그아웃)는 다음과 같이 진행할 수 있다.

  • 세션에 저장한 데이터만 삭제 : sesison.removeAttribute("이름");
  • 세션 자체를 삭제 : session.invalidate();