2017년 10월 16일 월요일

TDD이란? / Junit 연습. 예제

먼저 테스트 주도 개발(TDD, Test Driven Development)란??

-설계 이후 코드 개발 및 테스트 케이스를 작성하는 기존의 개발 프로세스와 다르게 테스트 케이스를 작성한 후 실제 코드를 개발하여 리펙토링 하는 절차

[기존]


[TDD]

TDD장점은?

-작업과 동시에 테스트를 진행함으로써 실시간으로 오류를 파악할 수 있음
-짧은 개발주기를 통해 고객의 요구사항을 빠르게 수용하거나 피드백을 줄 수 있고, 현재 상황을 쉽게 파악할 수 있음
-자동화 도구를 이용해 TDD의 테스트 케이스를 단위테스트로 사용가능
[JUnit, cppUnit, NUnit 등]


단점은? 

-기존의 개발 프로세스에 테스트 케이스 설계까지 추가되므로 코드 생산 비용이 높아짐

>>하지만 객체지향적인 코딩 능력을 향상시킬 수 있다고 한다. 



////////////////////////////////////////////////////////////////

<Junit을 이용한 기본테스트>

간단한 계산기 자바 코드가 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.net.mypage;
public class Calculator {
    int add(int i, int j){
        return i+j;
    }
    
    int subtract(int i, int j){
        return i- j;
    }
    
    int multiply(int i, int j){
        return i*j;
        
    }
    
}
cs
이것을 테스트하려면 상단 메뉴의 New Java Class 부분의 JUnit Test case를 생성하면 된다. 


그 후 이렇게 코드 작성 후 Run As 부분의 JUnit test를 통해 테스트 가능하다 .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.net.mypage;
import static org.junit.Assert.*;
import org.junit.Test;
public class CalculatorTest {
    
    @Test
    public void add() {
        Calculator cal = new Calculator();
        int res = cal.add(24);
        //과거 였으면 sys.out으로 확인했겠지만 junit은 assert를 통해 (기대하는 값, 결과 값) 으로 확인할 수 있음 
        assertEquals(6, res);
        
    }
    
}
테스트 성공시 이런 화면이 보이고 실패시 failures 부분에 숫자가 올라간다.



<테스트 독립성>

Before와 after 어노테이션을 통해 test메소드 실행하기 전과 후 처리를 해줄 수 있다.
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
package com.net.mypage;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class CalculatorTest {
    private Calculator cal;
    
    
    //before를 통해 test 메소드가 실행될때마다 setup이라는 메소드가 호출됨  cal 초기화 작업을 매번함 (선 처리 작업)
    @Before 
    public void setup(){
        cal = new Calculator();
        System.out.println("setup");
    }
    
    
    @Test
    public void add() {
        
        assertEquals(8, cal.add(17));
        System.out.println("add!");
    }
    
    @Test
    public void mul() {
        
        assertEquals(8, cal.multiply(18));
        System.out.println("multiply");
    }
    //after는 test메소드 실행 후 실행됨 (후처리 작업) >>before와 after를 통해 테스트 독립성 제공 
    @After
    public void after(){
        System.out.println("after");
    }
    
    
}
cs


콘솔창으로 보는 메소드 실행 순서

Test메소드 실행하기 전 Before가 선언된 setup메소드 실행 > test 실행 > after 실행
두번째 test 실행하기 전 다시 before 실행 > test 실행 > after 실행



서블릿과 JSP

서블릿이란?(Servlet) 

-자바 기반으로 만드는 웹 어플리케이션 프로그래밍 기술 
-웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종 
-동적 웹어플리케이션 컴포넌트
- .java
-자바 스레드 이용하여 동작
-MVC패턴에서 Controller로 이용됨
-서블릿은 서블릿 컨테이너에서 관리됨 


서블릿 컨테이너란?

-서블릿의 생명주기를 관리하고 요청에 따른 스레드를 생성해
-클라이언트의 Request를 받아주고 Response를 보낼 수 있게 웹 서버와 소켓을 만들어 통신
-대표적으로 Tomcat 
-통신 지원, 생명주기 관리, 멀티 스레딩 관리, 선언적인 보안 관리, JSP지원 등의 역할을 함


JSP(Java Server Page)란?

-자바 소스 코드 속에 HTML 코드가 들어가는 서블릿과 반대
-HTML속에 자바 코드가 들어가는 구조를 갖는 웹 어플리케이션 프로그래밍 기술
-자바 코드는 <% 코드 %> 형태로 사용
-JSP또한 결국 컴파일 후에 Sevlet코드로 변환되어 작동하기 때문에 Servlet과 거의 같다.
(JSP는 페이지 요청이 있을 시에는 최초에 한 번 자바코드로 변환된 후서블릿 클래스로 컴파일 된다.)
-서블릿과 JSP는 상호 연계되어 JSP에서 정적인 부분을 담당, 서블릿은 보다 동적인 부분을 처리하여 보다 효율적인 웹사이트를 구성할 수 있다. (JSP 뷰, Servlet 컨트롤러)




참조:


2017년 10월 7일 토요일

DB모델링

데이터 모델링(data modeling)이란 주어진 개념으로부터 논리적인 데이터 모델을 구성하는 작업을 말하며, 일반적으로 이를 물리적인 데이터베이스 모델로 환원하여 고객의 요구에 따라 특정 정보 시스템의 데이터베이스에 반영하는 작업을 포함한다. 후자의 의미로 흔히 데이터베이스 모델링으로 불리기도 한다.[1]





데이터모델링 관련 참조
http://vnthf.logdown.com/posts/2016/03/18/650365
데이터 관계 참조
http://tech.devgear.co.kr/db_kb/331

mybatis란?

http://www.mybatis.org  설명
마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해준다. 마이바티스는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있다.




MyBatis의 특징
 - 간단하다 : 간단한 퍼시스턴스 프레임워크
 - 생산성 : 62%정도 줄어드는 코드 , 간단한 설정
 - 성능 : 구조적강점(데이터 접근 속도를 높여주는 Join 매핑)
             여러가지 방식의 데이터를 가져오기 전략 (가져오기 미루기 , SQL 줄이기 기법)
 - 관심사의 분리 : 설계를 향상 (유지보수성)
                          리소스를 관리하여 계층화를 지원(커넥션,PreparedStetement,결과셋)
 - 작업의 분배 : 팀을 세분화하는 것을 도움
 - SQL문이 애플리케이션 소스 코드로부터 완전 분리
 - 이식성 : 어떤 프로그래밍 언어로도 구현가능 (자바,C#,.NET,RUBY)
 - 오픈소스이며 무료이다.


예시) 내가 쓴 부분 UserMapper.xml 중 일부
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="UserMapper">
     
     <!-- 아이디로 회원정보  불러오기 -->
     <select id="findByID" resultType="net.cot_pr1.domain.User">
         select * from users where userid= #{userid}
     </select>
     
     <!-- 아이디로 프로필 이미지 찾기 -->
     <select id="findprofile" resultType="string">
         select profileimg from users where userid= #{userid}
     </select>
     
     <!-- 회원가입 -->
     <insert id="create">
         insert into users ( userid, password, name, email) values (#{userid}, #{password}, #{name}, #{email})
     </insert>
    
    <!-- ...나머지부분 생략 -->
     
 </mapper>
cs


ibatis > mybatis 변경됨..
차이점
http://uwostudy.tistory.com/19
http://aid.altibase.com/pages/viewpage.action?pageId=11207174


참고, 출처
http://www.mybatis.org/mybatis-3/ko/
http://ekfqkqhd.tistory.com/entry/mybatis%EB%9E%80
http://alicepure.blogspot.kr/2013/10/mybatis.html

제네릭이란?

제네릭Generics
ex) ArrayList<E>

다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일시의 타입 체크(compile-time type check)를 해주는 기능이다.

>>쉽게 말해 다룰 객체를 미리 명시해줌으로써 형변환을 사용하지 않고 사용하는 것.....
<String>제네릭스는 String 객체만 사용 가능, 다른 자료형 사용하면 오류!?

ArrayList<String> StringList = new ArrayList<String>();
StringList.add("a");
StringList.add("b");

ArrayList<Integer> IntegerList = new ArrayList<Integer>();
IntegerList.add(1);
IntegerList.add(2);

ArrayList<Tv> TvList = new ArrayList<Tv>();
TvList.add(newTv());

ArrayList List = new ArrayList();
List.add(1);
List.add("a");
>>제네릭스를 사용하지 않는 경우 Object타입으로 간주된다. 그래서 형변환을 해줘야함!!

<> 형태
<E> : Element(자바 컬렉션에서 주로사용)
<K>,<V> : Key, Value(map 자료구조에서 주로 사용)
<T> : 일반적인 제네릭 타입을 의미
<N> : Number를 의미

**컬렉션 정리
http://hackersstudy.tistory.com/26

제네릭의 장점
1. 타입 안정성을 제공한다.

2. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다.




참고
http://arabiannight.tistory.com/entry/%EC%9E%90%EB%B0%94Java-ArrayListT-%EC%A0%9C%EB%84%A4%EB%A6%AD%EC%8A%A4Generics%EB%9E%80


http://kiwi99.tistory.com/3

2017년 10월 5일 목요일

Mybatis 자동 생성키 사용

mysql의 경우에 auto_increment 를 통해 자동 생성키를 쓸 수 있는데, insert시 이 자동생성된 값을 가져오고 싶을때는

useGeneratedKeys를 true로 설정, KeyProperty에 가져오고싶은 값을 넣는다. 

나의 경우엔 답변or댓글의댓글을 만드는 과정에서 그룹을 설정하기위해 자동증가값을 그룹에 같은값으로 업데이트하려고 했었다. 

(...게시물을 만들면서 group을 같이 설정하고싶었는데, 실패해서 게시물만든후 group값을 bnum으로 업데이트하였다...비효율적인 것 같으므로 다른 방법을 찾아야할 것 같다.)

아무튼 자동증가되는 primarykey를 가져오고 싶었는데 계속 0을 가져왔었다. 

그래서 

매퍼에 위의 방법과 같이 bnum을 키프로퍼티에 넣고 

1
2
3
    <insert id="insert" parameterType="net.cot_pr1.domain.QnA" useGeneratedKeys="true" keyProperty="bnum">
        INSERT INTO qna (bnum, title, content, writer, answer, qgroup) VALUES (0,#{title},#{content},#{writer},#{answer},#{qgroup})
    </insert>
cs

컨트롤러에서 

1
2
3
4
5
6
qnaService.create(vo);
        
int bnum = vo.getBnum();
vo.setBnum(bnum);
qnaService.setgroup(vo);
        
cs
이런식으로 bum을 다시 가져와서 group에 넣었다..

2017년 10월 1일 일요일

삼항 연산자

if문을 줄여서 쓸 수 있는 삼항 연산자


ex)
1
2
3
4
5
if(a<b){
    res = 1;
}else{
    res=2;
}
cs
삼항 연산자로 다시 나타낸다면 

1
result = (a<b)?1:2
cs


(조건)? a : b;


조건이 
true면 a , false면 b