[WEB]

[Spring] Spring / MyBatis 리뷰

ddgoori 2020. 1. 15. 14:42

https://github.com/iluvdadong/Java-Spring-Project

 

iluvdadong/Java-Spring-Project

Java Spring Framwork / myBatis / JUnit. Contribute to iluvdadong/Java-Spring-Project development by creating an account on GitHub.

github.com

MyBatis

 

 

1. 마이바티스 + 스프링을 쓰려면 pom.xml에 아래의 dependencies 추가

* 스프링과 마이바티스를 같이 쓸 수 있음

* 마이바티스는 동양권에서 많이 씀

 

		<!-- mybatis, spring과 연동하기 위한 mybatis-spring을 추가한다. package명을 보면 spring이 제공하는 것이 아니라 mybatis쪽에서 spring을 지원하기 위해 제공하는 것을 알 수 있다.
		spring쪽에서는 mybatis와 유사한 spring jdbc 프로젝트를 가지고 있다. -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.2.2</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.0</version>
		</dependency>

* 한단계 더 나가려면 하이버네이트 같은 것도 씀. => 스타트업 같은데서 잘 씀

 

2. ApplicationConfig에서 어플이케이션에 대한 설정을 한다.

@Configuration 내가 컨피규레이션이에요!

@import 마이바티스~~!

 

3. 마이바티스를 쓰겠다는 것은 DAO를 쓰겠다는 것

 

4. 트랜잭션 사용하려면 트랜잭션 매니저를 설정해놓아야 함

 

5. H2디비를 사용하려고 한다~~~ 쟤네도 jar(java class)이기 때문에 넣어 줌

 

5. MyBatisConfig에서 @Mapper정의~

 

6. BoadMapper.java

SQLSessionFactoryBean이 중요!

 

SqlSessionTemplate은 그냥 템플릿 임. => 근데 마이바티스3은 알아서 해줌. => 2까지는 템플릿 메소드를 내가 직접 호출해서 해야하는데 3에서는 그냥 인터페이스만 정의하면 알아서 가서 객체를 만들어서 사용해 줌

 

=> DAO에 구현체를 만든게 없음. 인터페이스만 만듬. => 구현체는 MyBatis가 만들어 줌

USersMApper의 메소드 이름이랑 UsersMapper.xml의 이름과 동일 해야함!!

 

UsersMapper.java의 이름과, UsersMapper.xml의 id, 네임스페이스 이름이 맞아야 한다 ex. getUsers

데이터베이스에서 user_id 하지만 DTO객체에는 userId 이기 때문에 값을 못채움!

그래서 XML파일에 resultmap이라는 것을 선언해서 쓰게 함

 

Alias 사용법

 

 

MyBatis 2에는 아래의 경우 오류가 날 수 있음... (버전이 낮은 경우)

 

resultmap에서 선언해준 것들이랑

아래의 select sql구문에 사용하는 컬럼들이랑 정확히 일치해야함 (수가)

 

* MyBatis를 사용하면 db와 분리됨..쉬움.. 아래처럼 코드 몇 줄안에 해결 가능~~!

 

 


 

 

JUnit

 

Jnunit이 스프링이랑 같이 붙어주면, 아래 코드만 추가해도 테스트를 main에서 분리해서 편리하게 테스트 가능

 

 

 

테스트 케이스의 장점은

assert메소드를 사용할 수 있다는 것!

=> assert메소드의 장점은 알아서 맞는지 테스트 해주는 것 print는 그냥 찍어본 것,.실제로는 사용X

 

 

 

DAO란?

 

이 것이 DAO! ex BoardMapper.java

 


레이어

 

 

DL 데이터 레이어 - DAO(~~Mapper) <-이곳에서 데이터베이스에 넣거나 삭제하거나 그런 것만 구현

----------------------------------------- ~.DAO (MVC 설정 X, 어플리케이션 설정만 함)

BL 비지니스 레이어 <-실제 로직은 여기서 구현 (Service가 데이터 레이어인 DAO와 소통)

----------------------------------------- ~.Service 라는 객체 만듬 얘가 DAO를 사용함

|

Interface (결합도를 떨어트리는 용) - !뒷쪽이 바껴도 앞단이 영향을 안받음!

PL 프리젠테이션 레이어 (Controller 둠)

-----------------------------------------

 

* BL DL 부분은 다른데서 사용할 수도 있기 때문에 applicationconfig에 따로 줬음

* 모든 레이어 단에서 SPRING 사용중

* PL 에서는 Spring MVC 사용 중 => SpringMVC Config자체에서 설정 함

* BL (Service 레이어 구현 중)

 

 

Spring

=> 우리가 만든 객체에 스프링에게 알려주는게 중요!

=> 이 객체를 스프링에게 알려주는 일을 함

annotation(편한 방법) or xml에 bean 등록 java config에 등록 => 야~~이거 등록해줘!! 스프링 사용해야하니깐!!

 

 

 

스프링의 트랜재션 처리

 

입금 출금 중 둘중 하나라도 안되면 롤백 시키는 기능

@Transactional 만 붙이면 됨 

 

 

Controller

=> 아래처럼 annotation 해줘야 빈 생성 가능

 

 

아래를 입력하면 알아서 url이 ..users로 됨

@RequestMapping(path="/users")

 

유저 목록 보여주는 애 부터 만들어봅세

 

 

UserController.java

 

package examples.springmvc.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import examples.springmvc.dto.User;
import examples.springmvc.service.UserService;

@Controller	
@RequestMapping(path="/users")
public class UserController {
	
	@Autowired
	private UserService userService;
	
	@GetMapping //getmapping 꼭 시켜줘야함
	public String getUsers() { //이 요청이 들어가면
		
		List<User> users = userService.getUsers();
		return "users/list"; //이 jsp를 보여줄거야
							//Jsp화면이 들어갈 부분
	}
	
	
}

 

 

포워딩이란

 

 

화면에 뿌려주는 부분

client가 요청하면

 

서버사이드에서

dispatcherservlet이 받음 ~ 얘까 => controller에 

실제 뷰는 jsp한테 니가 응답해! 하고 보냄.

이것을 바로 포워딩이라고 함 (이걸 해주세요~라고 요청받았지만 다른 누군가에게 넘기는 것)

 

포워딩에 되는 동안 계속 유지되는게 request...

https://rwd337.tistory.com/33

 

JSP Servlet 기초(19) 포워딩(Forwarding)

이번엔 포워딩에 대하여 알아보겠습니다. 내가 어떠한 요청을 받았을때 그것을 내가 직접 처리하지않고 다른쪽으로 위임할때 포워딩 이라고한다 포워딩은 우리가 JSP 서블릿에서 2가지 클래스를 이용한다 RequestD..

rwd337.tistory.com

 

request는 한번 응답이 끝나면 사라짐!

그래서 쿠키랑세션을 이용해야함!

 

리다이렉트

https://selectwiggle.tistory.com/25

 

Redirect와 Forward의 차이점

• Forward와 Redirect의 차이 JSP/Servlet에는 현재 작업중인 페이지에서 다른 페이지로 이동하는 두 가지 방식의 페이지 전환 기능이 있다. 하나는 Forward이고 하나는 Redirect이다. 둘 다 다른 웹 페이지로 이..

selectwiggle.tistory.com

 

리퀘스트 스코프 => 요청이들어와서 끝날때까지

세션 스코프는 => 요청이 계속 들어와도 살아있다. 사용자 별로 있음

어플리케이션 스코프 => 어플리케이션의 하나 => 서버가 떳을때~~

https://victorydntmd.tistory.com/155

 

[JSP/Servlet] 객체 범위 ( Scope )

1. 객체 범위 종류 웹 애플리케이션에는 4개의 객체 범위가 존재합니다. page 영역 한 번의 클라이언트 요청이 오면, 하나의 JSP 페이지가 응답됩니다. page 영역은 이 때 하나의 JSP 페이지 내에서만 객체를 공유..

victorydntmd.tistory.com

Spring은 POJO기반!

가급적이면 다른라이브러리에 종속되지 않게 목적을 가진 것

 

Http리퀘스트에 직접 접근이 아니라, 스프링의 모델에 접근하면, 스프링이 대신해줌!

 

 

점점 추세는 프론트단에서 다 하고

백엔드는 api, 데이터만 전송

 

 

 

=>

 

localhost:8080/users - 회원목록

localhost:8080/users/joinform - 회원가입화면

BoardService 구현

- board 리스트

BoardController

 

localhost:8080/boards - 게시물 목록이 보이도록 추가

 

 

+ 추가 복습

 

클아이언트 http 에서는 쿠키와 세션을 이용하여서 사용자의 정보를 기억한다.

- 쿠키: 클라이언트들이 유지해야 하는 정보를 유지해야하는 것 - 서버가 하나씩 쿠키를 구워서 증표를 클라이언트에 보냄

=> 쿠키는 언제든지 악의적으로 정보를 갈취할 수 있었다.

- 세션: 그래서 중요한 정보를 세션에 맡김 (세션도 내부적으로 쿠키를 씀. 세션을 발급할 떄 세션 id를 쿠키로 구워서 브라우저에 응답해줘). 그럼 브라우저가 세션 id를 가지고 있고, 각기 이것이 다르기 때문에, 요청이들어오면 서버는 이 id를 찾아서 응답해줌

 

* 요청할 때 request 객체에는 항상 쿠키에대한 정보도 같이 들어옴

* 상태: 브라우저 버전, 언어, 프로토콜 등 많은 정보들을 가져오는 것임

* 세션이 오면 항상 쿠키를 뒤짐. 쿠키가 있었으면 그걸 그대로 함. 없었으면 다시 생성해줌

 

리퀘스트 객체는 응답이 받을때까지만 유지되고 없어지기 때문에, 유지하고 싶은 정보가 있으면 세션에 저장한다.

 

 

JSP / JSTL 라이브러리

 

http://theeye.pe.kr/archives/1563

불러오는 중입니다...

 

 

쿠키 없애는 방법

 

쿠키는 똑같은 쿠키를 만들어서 브라우저에 보내고 쿠키의 유지시간 0으로 주면 삭제된다.

새로운 쿠키로 변경되는 성질 이용! 쿠키 이름은 똑같은 것 1개만 가질 수 있기 때문.

 

세션은 서버가 가지고 있어서 java코드로 없앨 수 있음

세션의 유지시간은 default는 -2 값으로 브라우저가 열려있는 동안 유지됨, 그러나 시간을 따로주면 브라우저 꺼져도 계속 지속됨