본문 바로가기

스프링부트를 이용한 웹페이지 만들기 도전!!/이클립스 버전

SPRING BOOT를 이용한 나의 첫 웹페이지 제작 (6) - Service

지금까지 한 것

 

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테이블에 게시물번호, 제목, 글내용, 비밀번호, 작성일자 가 표시되는 것을 확인할수 있다.

 

서비스에 대한 작성과 회원가입 서비스, 게시물 작성 서비스에 대한 테스트가 성공적으로 완료되었다.