2017. 3. 31. 11:31

이 자바 스프링 넘이란 놈을 하면서.....진짜....설정때문에 어마어마한 시간을 보내고 있다~


내가 자바를 싫어했던 이유가 새록새록 생각났다~


먼저 pom.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
   <!-- print query log -->
        <dependency>
            <groupId>org.lazyluke</groupId>
            <artifactId>log4jdbc-remix</artifactId>
            <version>0.2.7</version>
        </dependency>
    
    
       <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.31</version>
        </dependency>
 
        <!-- mybatis -->
        <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>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
cs

위에 것들을 추가해준다. 

mysql, mybatis 그리고 쿼리 띄어주는것까지 추가해주고,




/src/main/webapp/WEB-INF/spring/ 폴더의

root-context.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
   <bean id="dataSourceSpied" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/testtable" />
        <property name="username" value="root" />
        <property name="password" value="password" />
    </bean>
 
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:/mapper/**/*.xml" />
    </bean>
 
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSession" />
    </bean>
 
 
    <!-- query log -->
    <bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
        <constructor-arg ref="dataSourceSpied" />
        <property name="logFormatter">
            <bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
                <property name="loggingType" value="MULTI_LINE" />
                <property name="sqlPrefix" value="SQL    :  " />
            </bean>
        </property>
    </bean>
 
cs


mysql 정보는 

        <property name="url" value="jdbc:mysql://localhost:3306/testtable" /> 에

localhost:포트/스키마이름 

해주고, 

밑에 아이디랑 비번 넣어준다.


그 밑에 sqlSession은 마이바티스를 불러와서 쿼리를 넣어준다는 말인데,

쿼리문장을 넣는 곳에 경로를 넣어준다.

        <property name="mapperLocations" value="classpath:/mapper/**/*.xml" />

위 경로는 

/src/main/resources/mapper/전체폴더/전체.xml파일

이란 뜻이다.

나 같은경우는 게시판을 만들꺼니까.

/src/main/resources/mapper/board/board_sql.xml 이란 파일을 만들었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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="user">
    <select id="selectCount" resultType="Integer">
        <![CDATA[
            SELECT count(*)  
              FROM board
        ]]>
    </select>
    <!-- <select id="selectUserId" parameterType="hashmap" resultType="Integer">
        <![CDATA[
            SELECT count(user_id) checkResult 
              FROM user 
                  WHERE user_id = #{user_id}
        ]]>
    </select> -->
</mapper>
 
cs


보드 테이블 갯수조회 쿼리만 넣었다.

값이 안들어가도 그냥 조회만되게..



/src/main/java 밑에 패키지를 만들어 주고,

나는 패키지 com.myboardtest.dao 만들었다. 

콘트롤러랑 다른 패키지를 만들었다.

그리고, 거기에

/src/main/java/com.myboardtest.dao/AbstractDAO.java 를 만들어 주고,

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
package com.myboardtest.dao;
 
import java.util.List;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
 
public abstract class AbstractDAO {
    protected Log log = LogFactory.getLog(AbstractDAO.class);
 
    @Autowired
    private SqlSessionTemplate sqlSession;
 
    protected void printQueryId(String queryId) {
        if (log.isDebugEnabled()) {
            log.debug("\t QueryId : " + queryId);
        }
    }
 
    public Object insert(String queryId, Object params) {
        printQueryId(queryId);
        return sqlSession.insert(queryId, params);
    }
 
    public Object update(String queryId, Object params) {
        printQueryId(queryId);
        return sqlSession.update(queryId, params);
    }
 
    public Object delete(String queryId, Object params) {
        printQueryId(queryId);
        return sqlSession.delete(queryId, params);
    }
 
    public Object selectOne(String queryId) {
        printQueryId(queryId);
        return sqlSession.selectOne(queryId);
    }
 
    public Object selectOne(String queryId, Object params) {
        printQueryId(queryId);
        return sqlSession.selectOne(queryId, params);
    }
 
    @SuppressWarnings("rawtypes")
    public List selectList(String queryId) {
        printQueryId(queryId);
        return sqlSession.selectList(queryId);
    }
 
    @SuppressWarnings("rawtypes")
    public List selectList(String queryId, Object params) {
        printQueryId(queryId);
        return sqlSession.selectList(queryId, params);
    }
}
cs


이렇게 만들고,

 얘는 abstract class라 또

src/main/java/com.myboardtest.dao/boardDAO.java 를 만들어서 AbstractDAO.java를 불러왔다.

1
2
3
4
5
6
7
8
9
10
11
package com.myboardtest.dao;
 
import org.springframework.stereotype.Repository;
 
@Repository("dao")
public class boardDAO extends AbstractDAO {
    public Integer selectCount() {
        return (Integer) selectOne("user.selectCount");
    }
}
 
cs


참고로 여기에는 서비스파일을 만드는 대신에,

어노테이션으로 @Repository("dao") 라고 만들어줬다.

아직 어노테이션은 잘 모르지만, @Repository 라는게, dao라는 이름으로 저장소같은거를 만들어줬다라고 이해했다.


그리고, Integer로 받을꺼기 때문에 인티저 클래스 만들어 주고,


*int 는 null 값을 못받고, Integer는 널 값을 받을수있기때문에 Integer로 했다.



그리고, selectOne("user.selectCount"); 은, AbstractDAO에서 selectOne이라는 클래스에 

board_sql.xml에 있는 namespace = user에서 id = selectCount 에 있는 쿼리문을 가져와서 넣는다는 거다.



그리고 홈컨트롤러 

/src/main/java/com.myboardtest.myboard/HomeController.java 에서 애네를 불러와야한다.

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
package com.myboardtest.myboard;
 
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
import com.myboardtest.dao.boardDAO;
 
/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
 
    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
 
    // @Autowired
    // private SqlSessionTemplate sqlSession;
 
    /**
     * Simply selects the home view to render by returning its name.
     */
    @Autowired
    private boardDAO dao;
 
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);
 
        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
 
        String formattedDate = dateFormat.format(date);
 
        model.addAttribute("serverTime", formattedDate);
 
        // System.out.println(sqlSession.selectOne("SELECT * FROM BOARD"));
        /*
         * boardDAO dao = new boardDAO();
         */ System.out.println(dao.selectCount());
        return "home";
    }
 
}
cs


@Autowired

private boardDAO dao;

라는 거가 아까 boardDAO.java에서 저장소에 넣은 dao를 불러온다.


System.out.println(dao.selectCount());

그리고 그냥 콘솔에서 찍어만 보았다.

결과값이 뜨더군.


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

이 넘의 스프링 시작하는데, 너무 클래스들이 얼히고 설켜 있어서, 처음에 구조 파악하는데 오래걸렸다.

지금은 그냥 저장소에서 불러왔는데, 

서비스 패키지를 만들어 주고, 서비스들을 그곳에 모아두면 나중에 이용할때 더 편하긴 하다.

그거는 다음 포스트에 올리는걸로




'컴퓨터 > Java Spring Framework' 카테고리의 다른 글

JPA CascadeType 종류  (0) 2018.05.10
Spring Security logout Handler custom  (0) 2018.05.08
mod_jk연동 도메인 여러개  (0) 2018.03.09
톰캣 설치  (0) 2018.03.09
아파치 컴파일 설치  (0) 2018.03.09
Posted by Tyson
2017. 2. 22. 11:11

 

 

 

<table width="200" border="1">

<tr>

<td style="text-overflow:ellipsis; overflow:hidden">긴문자생략</td>

</tr>

</table>

 

 

td 스타일에 저거 넣어주면, 알아서 생략됨.

뒤에는 .....으로 보임.

 

이거 안될때, 

<table style="table-layout: fixed>

테이블 스타일에 이거 추가해주면 된다.

Posted by Tyson
2017. 2. 14. 18:49

메모장을 관리자 모드로 실행한다.


C:\Windows\System32\drivers\etc 폴더에 있는 

모든파일 보기로 한다.


host 파일을 연다.



127.0.0.1 clients2.google.com 

이런게 있을꺼다.

얘를 지우던지. 

앞에 #를 추가한다.


그리고 저장할때, 백신 프로그램이 띄어져 있으면,

엑세스 거부라고 할꺼다. 


잠깐 백신 프로그램은 꺼 놓도록...


이것때문에 계속 지우고 다시 설치하고 별 짓을 다함..ㅠㅠㅠㅠ

Posted by Tyson
2015. 12. 22. 18:38

Git 이란 넘을 이제야 이해해서 글을 씁니다.


회사내 테스트 서버에 깃은 설치했습니다. 


설치법은 설명이 많으니까~ 생략. 


근데, Git 사이트 가서 있는 윈도우용 프로그램을 설치하기는 했는데.... 


이넘을 리눅스서버랑 어떻게 연결을 하고 자료를 가져와야할지.....처음에 완전 개념이 안잡혔거든요.


그러면 리눅스 서버에 계정을 일일히 만들어서 해야하나?? 하는 생각도 하고 어찌할지 고민고민하다가.


이제야 이해했습니다.


윈도우에 Git를 설치하고 나면, 폴더에서 오른쪽 클릭했을때, Git GUI, Git Bash 등등이 생기죠.


먼저 서버에서 이 폴더는 깃을 써서 관리하겠다라고 해줘야합니다.

home/www 이란 폴더라고 가정하겠습니다.

위 폴더로 간 다음에 

#git init

원하는 폴더에 git init을 해주면 설정됬다고 뜰껍니다. 

그리고 

#ll -al 

하고 보면 .git 이라는 폴더가 생겼습니다.

그다음에 파일들을 등록을 해줘야 합니다.

#git add .

#git commit -m "코멘트"

이렇게 하면 폴더에 있던 파일들이 다 등록이 됩니다.

이제부터는 깃에서 파일들을 다 관리하는거죠.



이제 다시 내 컴퓨터 윈도우로 가서 작업할 폴더 하나 만듭니다.

그리고 마우스 오른쪽 버튼을 눌러서 git Bash 을 실행하면 터미널 같은게 열릴겁니다.

이제 서버에 있는 자료를 여기로 가져오겠습니다.


#git clone ssh://root@192.168.0.0:22/home/www/.git

                  서버아이디@ 서버주소:22/디렉토리 주소

이런식입니다.

인터넷에 GitHub에서 하는법은 많은데, 회사내 서버에서 직접 쓰고 싶은데, 설정법을 몰라서 해맸습니다.

ssh 붇이는거랑 서버주소. 그리고, 22 (이건 생략가능합니다.)

그리고 마지막에 아까 확인했던 .git 폴더를 꼭 써줘야 합니다.

그러면 패스워드 넣으라고 하고 넣으면 파일을 다 복사해서 가져옵니다.


그러면 이제 내 컴퓨터 로컬에서 작업하시고 다시 올릴실때입니다.


#git remote add origin ssh://root@192.168.0.0:22/home/www/.git

이렇게 써서 원격저장소 등록을 해 놓으라고 하는데,

클론 써서 가져온것은 자동으로 등록이 되어있어서,

그냥

#git push origin master

           보내고 싶은 브랜치 / 내보는 브랜치 입니다.

                         저장소


근데, 여기서 에러가 뜹니다. 

왜@@@@

저도 master 원격저장소도 master인데, 내용이 틀리기 때문입니다.

그래서 로컬에서 작업하실때는 다른 브랜치를 만드셔서 작업하시고 푸시 하시는 것이 좋아요~~

clone으로 받은 다음에 바로 

#git branch dev 

#git checkout dev

dev만들어서 dev로 이동해서 작업하거든요.

그래서 나중에 푸시할땐

#git origin dev

이런식으로 보내고,


서버에 접속해서 한명이 머지해주고 그러는 방법이죠~


Posted by Tyson
2015. 10. 22. 14:15

   클릭시 다운로드 하는거 만들때, 

click 이랑 on 차이??

on를 쓰면 나중에 추가되는 태그들도 먹힌다. 예로, file_down 클래스는 나중에 모달로, 창이 뜨니,

click에서는 file_down 클래스가 먹히지 않는다.


그래서 on를 쓴다.

근데, on의 순서??

 $('.row').on('click','.file_down',function()

  1.이벤트가 먹히는 클래스/2.클릭이벤트/3.file_down클래스가 클릭했을때 아래 이벤트를 1번 클래스해 한다?



 jQuery(document).ready(function(){

        $('.file_down').click(function(){

           var url = 'ajax_download?report_no='+report_no;

            location.href = url;

        });

    });

    <script type="text/javascript">

    jQuery(document).ready(function(){

        $('.row').on('click','.file_down',function(){

            var url = 'ajax_download?report_no='+report_no;

            location.href = url;

        });

    });

    </script>

'컴퓨터 > JavaScript (jQuery)' 카테고리의 다른 글

jQuery에서 따옴표 처리하기  (0) 2018.05.24
정규식 패턴 종류  (0) 2018.04.27
사업자 등록번호 체크방법  (0) 2018.04.24
Modal로 팝업 띄우기  (6) 2018.02.07
엔터 칠때 자동으로 클릭하기  (0) 2018.01.05
Posted by Tyson
2015. 10. 2. 10:40
1
2
3
4
5
6
7
8
9
10
11
12
13
    
<?
//숫자만 남기기.
    $pattern = '/([0-9])+/'; //패턴입력
    $max = 'U0000040'
    preg_match_all($pattern$max$match); //패턴에서 검색해서 숫자만 남기기
    $str = implode(''$match[0]); //문자 숫자로 바꾸기
    $str++;
    //앞에 000000넣기(9자리)
    $str = sprintf("%09d",$str); //자릿수 맞추가
    $str=(string)$str; //스트링으로 바꾸기
    $coupon_cd"U".$str; //앞에 U 붙여주기
?>
cs


Posted by Tyson
2015. 10. 1. 21:54

쿠폰 번호를 디비에서 시퀀스를 써서 번호를 매겨야 하는데, 처음에 안 만들어서, 

디비에서 최고 높은 값을 찾아서, +1를 해주고, 다시 앞에 'U' 붙이고, 0000 붙여서 자릿수를 맞춰 주고 싶을때 쓰는거다.

밑에 예시처럼.

U0000001

U0000039

U0000040



select 'U'||substr('000000000'||to_char(max(to_number(replace(nvl(coupon_cd,'0'),'U',''))) + 1),-9,9) max_coupon

from tk_coupon



처음에

select replace(coupon_cd, 'U', '') from tk_coupon;   //앞에 'U'를 제거해줌.


select to_number(replace(coupon_cd, 'U', '')) from tk_coupon;  //스트링을 넘버로 바꿔줌.


select to_number(replace(nvl(coupon_cd, '0'), 'U', '')) from tk_coupon;  //nvl 혹시 모르니, nvl를 써서, null값을 0으로 바꿔줌.


select max(to_number(replace(nvl(coupon_cd, '0'), 'U', ''))) from tk_coupon;   //그 다음에, 그중에서 max로 최대값을 찾아줌.


select max(to_number(replace(nvl(coupon_cd, '0'), 'U', '')))+1 from tk_coupon;   //거기에 1를 더해줌.


select to_char(max(to_number(replace(nvl(coupon_cd, '0'), 'U', '')))+1) from tk_coupon;  //다시 number에서, char로 바꿔줌.


select '000000000'||to_char(max(to_number(replace(nvl(coupon_cd, '0'), 'U', '')))+1) from tk_coupon;  //앞에 0000000를 자리수 맞게 붙여줌.  0000000004 이렇게 됨. 그래서 앞에 한자리를 지워줘야함.


//혹시 모르니, 11이 됬을때는, 0를 하나 더 지워주어야 함. 그래서 substr( [값], [시작자리수], [자리수갯수] )를 써서, 앞에를 잘라줌. 시작 자릿수에 (-)를 붙였을때는 뒤에서 부터 시작임.

select substr('000000000'||to_char(max(to_number(replace(nvl(coupon_cd, '0'), 'U', '')))+1), -9.9) from tk_coupon;

위에서부터, 9자릿수까지함.

 

//그 다음에 앞에 U를 붙여주면됨.

select 'U'||substr('000000000'||to_char(max(to_number(replace(nvl(coupon_cd, '0'), 'U', '')))+1), -9.9) from tk_coupon;


 값 :  U000000005


//칼럼 이름이 너무 길므로, 뒤에 max를 붙여서 이름을 바꿔준다.

select 'U'||substr('000000000'||to_char(max(to_number(replace(nvl(coupon_cd, '0'), 'U', '')))+1), -9.9) max from tk_coupon;



아니면, 쉽게 to_char 만 쓰는 법도 있다.


select 'U'||trim(to_char(to_number('1234556') + 1,'000000000')) max_coupon

from dual;


to_char로 자릿수 잡아주는거다.하지만, trim를 써서, 빈칸을 없애줘야한다.



Posted by Tyson
2013. 3. 27. 14:09

자바에서 Set 쓰는 이유는 LinkedList는 입력값에 순서가 있지만, 

순서없이 그냥 값만 입력하고 그것만 체크하면 더 빠르게 체크하고 그 값만 인식할수있다.


import java.util.*;


public class Lottery {

    public static final int pickNum = 6;

    public static final int maxNum = 40;


    public static void main(String[] args) {

   

        Set<Integer> winningNumbers = generateWinningNumbers();

        //System.out.println("Test Winning Num " +  winningNumbers);

        Set<Integer> ticket = getTicket();

        System.out.println();


        Set<Integer> checkNum = new TreeSet<Integer>(ticket);

        checkNum.retainAll(winningNumbers);

        

 

        System.out.println("Your numbers are " + ticket);

        System.out.println("The winning numbers are " +  winningNumbers);

        

        if (checkNum.size() > 0) {

        System.out.println("You had " + checkNum.size() + " matching numbers.");

            int prize = 250*checkNum.size();

            System.out.println("The matched numbers are " + checkNum);

            System.out.println("Your prize is $" + prize);

        }else {

        System.out.println("Sorry, You lost. There are no matching numbers.");

        }

    }

    

    // make Winning Number.

    public static Set<Integer> generateWinningNumbers() {

        Set<Integer> winningNumbers = new TreeSet<Integer>();

        Random r = new Random();

        while (winningNumbers.size() < pickNum) {

            int number = r.nextInt(maxNum) + 1;

            winningNumbers.add(number);

        }

        return winningNumbers;

    }

    

    // get player Numbers.

    public static Set<Integer> getTicket() {

        Set<Integer> ticket = new TreeSet<Integer>();

        Scanner console = new Scanner(System.in);

        System.out.println("  ***** Play Lotto ***** ");

        System.out.print("Please Enter 6 lotto numbers between 1 and 40 : ");

        while (ticket.size() < pickNum) {

            int number = console.nextInt();

            ticket.add(number);

        }

        return ticket;

    }

}


/* OutPut

 ***** Play Lotto ***** 

Please Enter 6 lotto numbers between 1 and 40 : 1 2 3 4 5 6


Your numbers are [1, 2, 3, 4, 5, 6]

The winning numbers are [11, 13, 14, 15, 38, 39]

Sorry, You lost. There are no matching numbers.

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

Test Winning Num [4, 15, 18, 29, 34, 35]

  ***** Play Lotto ***** 

Please Enter 6 lotto numbers between 1 and 40 : 4 15 18 29 30 31


Your numbers are [4, 15, 18, 29, 30, 31]

The winning numbers are [4, 15, 18, 29, 34, 35]

You had 4 matching numbers.

The matched numbers are [4, 15, 18, 29]

Your prize is $1000


*/


'컴퓨터 > Java' 카테고리의 다른 글

jstl에서 따옴표 처리 (문자열 이스케이프 처리)  (0) 2018.05.24
Posted by Tyson