지금까지 한 것
1. 이클립스설치,JDK설치,환경변수 설정
2. 이클립스STS설치, Web software설치
3. Spring starter project (스프링 부트 프로젝트) 생성
4. JSP VIEW(jstl,jasper), DEVTOOLS,spring-boot-starter-test,junit,mybatis등 추가적으로 필요한 디펜던시 추가,
5. Mysql을 이용해서 게시판 구현에 필요한 DB생성
6. dto,dao(Mybatis의 경우 mapper)클래스를 이용해서 DB의 객체화
7. Junit과 스프링-테스트를 이용해서 정상적으로 DB에 반영되는지 테스트
까지 진행하였다.
이번 포스팅에서 진행할 것은 서비스의 구현이다.
6번을 설명할 쯤에 DAO는 객체화된 DB를 이용해서 삽입,삭제,갱신,리스트반환 등의 실제적인 DB의 조작을 가능하게 한다고 설명했다.
그렇다면, 이제는 이러한 조작들을 각종 조건문과 순차적으로 조합해서 특정 기능을 구현하게 만들 것이다.
그리고 이렇게 조합된 기능을 '서비스'라고 부르게 될 것이다.
예를들면, INPUT으로 UserDto(아이디,pw,이름,성별,이메일등등..)를 받게 된다면 이 중에서 ID를 뽑아서 DB에 존재하는지 확인하자.
그리고 만약 존재한다면, 그 id에 매칭되어있던 pw가 입력된 pw와 맞는지 확인한다. 맞다면 TRUE를, 틀리다면 FALSE를
반환하게 메소드를 구현한다면, 이는 입력정보가 DB에 존재하고, 존재한다면 비밀번호가 맞게 입력되는지 확인하는
'로그인'이라는 기능을 구현하게 되는 것이다.
이번에는 board(게시판)의 측면에서는
write -> BoardDto를 인자로 받아서 DB에 입력해주는 service
modify -> BoardDto를 인자로 받아서 num이 같은 튜플을 찾아서 다른 정보들을 입력한 Dto의 정보들로 업데이트 해주는 서비스
remove -> int를 인자로 받아서 인자값과 같은 num을 가진 board튜플을 없애는 서비스
getBoard -> int를 인자로 받아서 인자값과 같은 num을 가진 board튜플을 조회하는 서비스
getBoardList -> 인자 없이 사용되고 모든 board튜플을 조회
getBoardSearchList -> 조건을주고 List를 반환시키는 서비스, 아직 미구현
그리고 user(클라이언트) 측면에서는
login -> id,pw를 인자로 받아서 id가 user DB에 있는지 확인하고 있다면 그 id를 가진 튜플의 pw가 인자 pw와 같으면 true 반환, id가 업거나 pw가 틀리면 false 반환하는 서비스
join -> userDto를 인자로 받아서 그 Dto의 id가 user튜플중에 있는지 확인하고(중복id확인) 없다면 user테이블에 넣어주는 회원가입 서비스
modify -> userDto를 인자로 받아서 id가 똑같은 튜플을 찾아서 그 튜플의 정보들을 수정하는 서비스
withdraw -> id를 인자로 받아서 id가같은 튜플을 찾아서 삭제하는 서비스
getUser -> id를 받아서 해당하는 튜플을 반환하는 서비스
getUserList -> 인자없이 사용하고 모든 유저튜플을 List로 묶어서 반환하는 서비스
를 만들것이다.
dto나 dao를 저장했던것 처럼 이번에는 com.example.demo.service에 클래스파일을
만들건데, 서비스의 경우에는 서비스를 바로 만드는게 아니라 인터페이스 서비스를 하나 만들고
그 인터페이스를 상속해서 implement하는 클래스를 통해서 구현한다.
즉, board쪽 서비스 인터페이스, 서비스 임플리먼트
user쪽 서비스 인터페이스, 서비스 임플리먼트가 필요하다는 것이다.
파일 구조는 이런식으로 될 것이다.
Service.java 클래스가 인터페이스이고 ServiceImpl.java가 그 인터페이스를 구현하는 클래스가 된다.
코드는 아래와 같다.
BoardService.java (인터페이스)
package com.example.demo.service;
import java.util.HashMap;
import java.util.List;
import com.example.demo.dto.BoardDto;
public interface BoardService {
public void write(BoardDto board);
public void modify(BoardDto board);
public void remove(int num);
public BoardDto getBoard(int num);
public List<BoardDto> getBoardList();
public List<BoardDto> getBoardSearchList(HashMap<String,Object> params);
}
BoardServiceImpl.java (인터페이스 구현)
package com.example.demo.service;
import java.util.HashMap;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.demo.dao.BoardMapper;
import com.example.demo.dto.BoardDto;
@Service
public class BoardServiceImpl implements BoardService {
@Autowired
private BoardMapper bMapper;
@Override
public void write(BoardDto board) {
// TODO Auto-generated method stub
bMapper.insertBoard(board);
}
@Override
public void modify(BoardDto board) {
// TODO Auto-generated method stub
bMapper.updateBoard(board);
}
@Override
public void remove(int num) {
// TODO Auto-generated method stub
bMapper.deleteBoard(num);
}
@Override
public BoardDto getBoard(int num) {
// TODO Auto-generated method stub
return bMapper.selectOneBoard(num);
}
@Override
public List<BoardDto> getBoardList() {
// TODO Auto-generated method stub
return bMapper.selectAllBoard();
}
@Override
public List<BoardDto> getBoardSearchList(HashMap<String, Object> params) {
// TODO Auto-generated method stub
return null;
}
}
UserSerivce.java (인터페이스)
package com.example.demo.service;
import java.util.List;
import com.example.demo.dto.UserDto;
public interface UserService {
public boolean login (String userId, String userPw);
public boolean join (UserDto user);
public void modify(UserDto user);
public void withdraw(String userId);
public UserDto getUser(String userId);
public List<UserDto> getUserList();
}
UserServiceImpl.java (인터페이스 구현)
package com.example.demo.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.demo.dao.UserMapper;
import com.example.demo.dto.UserDto;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper uMapper;
@Override
public boolean login (String userId,String userPw) {
UserDto user=uMapper.selectOneUser(userId); //id를통해 userDto가져와서 null이아니면 db에 존재하는 아이디 이겠죠?
if(user!=null) {
if(user.getUserPw().equals(userPw))
return true;
}
return false;
}
@Override
public boolean join (UserDto user)/*회원가입*/ {
if(uMapper.selectOneUser(user.getUserId())==null)//아이디중복여부체크
{
uMapper.insertUser(user);
return true;
}
else
return false;
}
@Override
public void modify(UserDto user) {
uMapper.updateUser(user);
}
@Override
public void withdraw(String userId)/*탈퇴*/ {
uMapper.deleteUser(userId);
}
@Override
public UserDto getUser(String userId) {
return uMapper.selectOneUser(userId);
}
@Override
public List<UserDto> getUserList(){
return uMapper.selectAllUser();
}
}
서비스 클래스파일을 모두 작성하였으니 이제 서비스코드를 실행할 어플리케이션을 만들어야 한다.
서비스 코드가 잘 수행되는지 어플리케이션을 만들고, 테스트를 진행해보자.
com.example.demo 패키지 안에 어플리케이션을 만들어서 uService와 bService가 잘 시행되는지 확인할 것이다.
HaounApplication.java
package com.example.demo;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.example.demo.dto.BoardDto;
import com.example.demo.dto.UserDto;
import com.example.demo.service.UserService;
import com.example.demo.service.BoardService;
@SpringBootApplication
public class HaounApplication {
private UserService uService;
private BoardService bService;
public void userTest()
{
UserDto user = new UserDto();
user.setUserId("test2");
user.setUserPw("test2");
user.setUserName("테스트2");
user.setUserGender("남");
user.setUserEmail("test2@test2.test");
uService.join(user);
System.out.println(uService.getUser("test2"));
System.out.println("로그인 결과:"+uService.login("test2", "test2"));
}
public void boardTest() {
BoardDto board = new BoardDto();
board.setNum(1972);
board.setPassword("9596");
board.setContent("학식먹을까 배달먹을까");
board.setTitle("고민");
bService.write(board);
for(BoardDto b : bService.getBoardList())
System.out.println(b);
}
}
userDto에 아이디, 비밀번호, 성별, 이메일, 이름을 넣고
이 것을 uSerivce.join (회원가입) 해주는게 user측의 서비스다.
또한 boardDto에는 num, pw, 콘텐츠, 제목을 넣어서
이 것을 bService.write (게시물 작성) 해주는게 board측의 서비스 이다.
이 어플리케이션 파일을 직접 실행할 것이 아니라 테스트코드를 만들어서 테스트 할 것이므로
테스트 패키지에 이 어플리케이션을 테스트 하는 코드를 만들어서 실행시키자.
HaounApplicationTests.java
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.example.demo.dto.BoardDto;
import com.example.demo.dto.UserDto;
import com.example.demo.service.BoardService;
import com.example.demo.service.UserService;
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class HaounApplicationTests {
@Autowired
private UserService uService;
@Autowired
private BoardService bService;
@Test
public void userTest()
{
UserDto user = new UserDto();
user.setUserId("test2");
user.setUserPw("test2");
user.setUserName("테스트2");
user.setUserGender("남");
user.setUserEmail("test2@test2.test");
uService.join(user);
System.out.println(uService.getUser("test2"));
System.out.println("로그인 결과:"+uService.login("test2", "test2"));
}
@Test
public void boardTest() {
BoardDto board = new BoardDto();
board.setNum(1972);
board.setPassword("9596");
board.setContent("학식먹을까 배달먹을까");
board.setTitle("고민");
bService.write(board);
for(BoardDto b : bService.getBoardList())
System.out.println(b);
}
}
정상적으로 잘 입력했다면 어플리케이션 테스트 파일에 대해서 junit test를 진행하도록 하자.
junit테스트가 성공적으로 끝나면 위의 그림과 같이 2개의 userTest(), boardTest()가 정상적으로 처리됨을 확인할 수 있고, 이제 mysql에 다시 들어가보면.
회원가입이 완료되어서 user테이블에 아이디, 비밀번호, 이름, 성별, 이메일이 입력된게 보이고
게시물 작성도 완료되어서 board테이블에 게시물번호, 제목, 글내용, 비밀번호, 작성일자 가 표시되는 것을 확인할수 있다.
서비스에 대한 작성과 회원가입 서비스, 게시물 작성 서비스에 대한 테스트가 성공적으로 완료되었다.