본문으로 바로가기

스프링[Spring] 게시판 만들기_02

category 언어/Spring 2020. 7. 6. 19:55
728x90

 

JDBC까지 추가하였으므로, 이제는 객체와 인터페이스를 구현하기로 한다.

 

1. 객체 생성

 

프로젝트의 src/main/java 속성아래에 

 

com.myboard.vo로 패키지를 생성후, MyBoardVo 클래스를 생성한다.

 

이후, 만들고자 하는 테이블의 객체들을 설정해준다.

 

이때, 각각의 객체들은 private로 설정한다.

 

접근 제어자(Private)를 사용하는 이유

이렇게 접근 제어자를 사용하는 이유는 보안 때문이라고 할 수 있다. 만약에 웹사이트에서 아이디와 비밀번호 같은 중요한 정보를 public 변수에 저장을 한다면 아무데서나 직접적으로 접근하여 그 값을 변경할 수 있기 때문에 노출되기 쉬워지게 된다. 이런 중요한 변수들은 대부분 private를 붙여준다.

 

나는 롤(LoL)에 대한 정보를 저장하는 테이블을 만들기로 하여 아래와 같이 만들었다.

 

package com.myboard.vo;

public class MyBoardVo {
	
	private String id;	//사용자 아이디
	private char w_l;	// 승, 패
	private String champion;	// 챔피언
	private String kda;		// KDA 킬/데스/어시
	private int kill_invol;	//킬 관여 비율

 

이후, private에 접근하기 위해 getter/setter를 사용한다.

 

마우스 우클릭 -> source -> Generate Getter Setter 클릭 -> Select All 체크 후 생성

 

여기에 단위테스트를 해보기 위해 @Override를 통해 아래와 같이 선언한다.

 

@Override
public String toString() {
	return String.format("[id=%s, w_l=%c, champion=%s, kda=%s, kill=invol=%d]",
			id,w_l,champion,kda,kill_invol);
}
	

 

완성된 MyBoardVo 클래스

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.myboard.vo;
 
public class MyBoardVo {
    
    private String id;    //사용자 아이디
    private char w_l;    // 승, 패
    private String champion;    // 챔피언
    private String kda;        // KDA 킬/데스/어시
    private int kill_invol;    //킬 관여 비율
    
    @Override
    public String toString() {
        return String.format("[id=%s, w_l=%c, champion=%s, kda=%s, kill=invol=%d]",
                id,w_l,champion,kda,kill_invol);
    }
    
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public char getW_l() {
        return w_l;
    }
    public void setW_l(char w_l) {
        this.w_l = w_l;
    }
    public String getChampion() {
        return champion;
    }
    public void setChampion(String champion) {
        this.champion = champion;
    }
    public String getKda() {
        return kda;
    }
    public void setKda(String kda) {
        this.kda = kda;
    }
    public int getKill_invol() {
        return kill_invol;
    }
    public void setKill_invol(int kill_invol) {
        this.kill_invol = kill_invol;
    }
 
}
 
 
 

 

 

2. 인터페이스 구현

 

프로젝트의 src/main/java 속성아래에 

 

com.myboard.mapper로 패키지를 만든 후, MyBoardMapper 인터페이스를 만든다.

 

이후, 아래와 같이 @(어노테이션)을 사용해 SQL문의 SELECT로 검색해보기로 한다.

 

package com.myboard.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Select;

import com.myboard.vo.MyBoardVo;

public interface MyBoardMapper {
	
	@Select("SELECT * FROM MYBOARD")
	public List<MyBoardVo> getList();

}

 

3. DB에 테이블 생성

 

단위테스트를 수행하기 전에, MYBOARD라는 이름의 테이블을 생성하기로 한다.

 

Oracle SQL sqldeveloper을 열어  사용자 이름 : scott, 비밀번호 : TIGER로 만든 후 접속한다.

(root-context.xml에서 username="scott', password="TIGER"로 설정)

 

만들고자 하는 롤 캐릭터 테이블을  sql문으로

CREATE TABLE MYBOARD(
    ID VARCHAR(20) PRIMARY KEY,
    W_L VARCHAR(5),
    CHAMPION VARCHAR2(20) NOT NULL,
    KDA VARCHAR2(20) CHECK(KDA LIKE '%/%/%'),
    KILL_INVOL NUMBER(10)
);

위와 같이 테이블을 생성해준다.

 

INSERT INTO MYBOARD VALUES ('목에데낄라','승','모르가나','1/1/5',63);
INSERT INTO MYBOARD VALUES ('DRX Deft','승','이즈리얼','3/1/6',43);
INSERT INTO MYBOARD VALUES ('탑에갱가요','패','엘리스','3/6/6',27);
INSERT INTO MYBOARD VALUES ('욕하면던짐','패','드레이븐','0/7/3',23);
INSERT INTO MYBOARD VALUES ('HIDE ON BUSH','승','에코','10/3/5',77);

 

데이터도 위와 같이 넣어준다.

 

데이터가 잘 들어갔는지 확인하기 위해서, 

 

SELECT * FROM MYBOARD; 로 검색해보면

 

 

위와 같이 잘 들어간 것을 확인할 수 있다.

 

이제 데이터가 적용이 되도록

COMMIT; 명령어를 친 후 사용하도록 하자.

 

4. 단위테스트 수행하기

 

DB의 데이터를 잘 들어오는지 확인하기 위해 먼저 테스트를 수행하기로 한다.

 

src/test/java에 com.myboard.mapper라는 패키지를 생성 후, MyBoardTest 클래스를 만든다.

 

* 폴더를 분류해놓는 이유? 
-같은 패키지명에 같은 폴더에 테스트 코드를 작성해도 상관없다.
-하지만, 그렇게 작성할 시 테스트 코드와 서비스 코드가 뒤섞이기 때문에 
프로젝트 폴더가 지저분해지게 된다. (그래서 Maven이 이 프로젝트를 나눠서 보관하는 역할)

 

스프링 테스트 진행

 

(1) pom.xml에서 spring-test 라이브러리 추가 (01페이지에서 이미 정의를 해둔 상태)

<dependency>
   	 	<groupId>org.springframework</groupId>
 	  	<artifactId>spring-test</artifactId>
  	  	<version>${org.springframework-version}</version>
  	  	<scope>test</scope>
	</dependency>

(2) root-context에서 bean에 등록

root-context.xml으로 이동하여, Namespaces 탭에서 mybatis-spring 체크

 

(3) 테스트 하려는 클래스에 RunWith(), ContextConfiguration() 설정

 

@RunWith - > 테스트코드가 스프링을 실행하는 역할을 할 것

@ContextConfiguration 지정된 클래스 또는 문자열을 이용해 객체를 스프링 내의 객체로 등록(빈 등록)

즉, RunWith,ContextConfiguration을 통해 경로를 설정

 

@Autowired는 주입하려고 하는 객체의 타입이 일치하는지를 찾고 객체를 자동으로 주입한다.

이후, @Test를 통해 mapper인터페이스에 등록한 getList의 메서드를 호출해준다.

 

package com.myboard.mapper;

import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.myboard.vo.MyBoardVo;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")

public class MyBoardTest {
	
	private Logger log=Logger.getLogger(MyBoardTest.class);
	
	@Autowired
	private MyBoardMapper mapper;
	
	@Test
	public void testGetList() {
		for(MyBoardVo board:mapper.getList()) {
			log.info(board);
		}
	}
	

}

 

여기까지 완료 후, Run as->JUnit Test

 

 

 

다음과 같이 자바에서도 DB의 생성정보가 뜨는 것을 확인할 수 있다.

 

 

 

 

 

728x90