로봇청소기 필수 입니다.

 

 

 

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

 

Posted by by.타니
,

프로젝트를 진행하다 보면 서버단(JAVA)에서 파일을 저장해야 할 때가 생긴다.

 

이유야 여러가지가 있겠지만 가장 기초적인 파일 저장 샘플 로직을 공유해드립니다.

 

참고하셔서 성공적인 프로젝트를 수행하시길 바랍니다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
try{
     //파일 본문 내용을 String 변수에
     String s = "파일 저장 내용";
    
     String jsonFullPath = "/test/json/test.json";
    
     //파일 객체를 생성
     File fullFolder = new File(jsonFullPath);
    
     BufferedWriter writer = new  BufferedWriter;
     writer.write(s);
     writer.close();
 
   }catch(){
    
   }
cs
Posted by by.타니
,

프로젝트를 진행하다보면 가끔 cmd 명령을 날리는 로직이 필요할때가 있다. 

대부분 운영 환경은 리눅스일것이고

개발환경(로컬)은 윈도우일 것이다.

오늘은 java 환경에서 cmd 명령을 날리는 샘플 로직을 만들어 보겠다.

 

 

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
//1.실행할 명령어 배열 변수에 담기
 
String param1 = "test1.xml";
String param2 = "test2.xml";
String param3 = "test3.xml";
 
//cmd 명령창에서 python test1.xml test2.xml test3.xml  명령을 실행하는것과 똑같다.
String[] cmdArrayWindow = {"python",param1,param2,param3};
 
//리눅스일 경우 해당 명령어 실행(윈도우와 리눅스를 구분해야 할 경우)
String[] cmdArrayLinux = {"python3",param1,param2,param3};
 
String firstLine = null;
 
//시스템이 윈도우인지 리눅스 인지 판단
if(System.getProperty("os.name").indexOf("Windows")>-1{
    Process p = Runtime.getRuntime().exec(cmdArrayWindow);
BufferReader br = new BufferedReader(new InputStreamReader(p.getInputStream(),"euc-kr"));
 
firstLine = br.readLine();
 
}else{
    Process p = Runtime.getRuntime().exec(cmdArrayLinux);
BufferReader br = new BufferedReader(new InputStreamReader(p.getInputStream(),"euc-kr"));
firstLine = br.readLine();
}
 
System.out.prinln(firstLine);
cs
 
 
 

윈도우와 리눅스 환경을 구분하여 수행되는 명령어를 분기를 나눴다.

그리고 명령어 수행된후 리턴되는 값은 

한줄이라는 가정하에 한번만 읽어들여 String 변수값에 넣어 줬다. 

만약 리턴되는 값이 여러줄이라면 마지막

firstLine 변수에 집어 넣는 로직을 조금 수정해주면 되겠다.

 

이 포스팅이 도움이 되셨다면 좋아요 한번눌러주세요.^^;

 

Posted by by.타니
,

프로젝트를 진행하던중 AWX라는 시스템에 요청을 하여 응답해주는 JSON 응답값을 받아야 하는 기능이 필요했다.

 

그래서 서버단에서 URL을 요청하는 로직을 구현해야 했다. 

결과적으로 URL마지막에 "/"를 붙이지 않아 오랜 삽질을 하는 바람에 JAVA 단에서 REST API 를 호출 하는 방법을 전부 알게 되었다.

 

"/" 하나 때문에 1주일을 고생을 했다.

AWX 서버가 원망스러웠다. 

URL 마지막에 "/" 하나가 없다고 401(인증에러) 응답이 왔던 것이다 

 

만약 그런 URL이 없다고 응답이 왔으면 바로 수정했었을텐데...


아무튼 총 3가지 방법이 있다.

 

1.HttpURLConnection

 

2.HttpClient

 

3.스프링 RestTemplate

 

[sample Code]

1.HttpURLConnection 방식

URL url = new URL("요청하고 싶은 url");

HttpURLConnection conn = (HttpURLConnection)url.openConnection();



//인증방식에는 두가지가 있다.

//1. 토큰 방식

//2. ID / PW 를 Base64 로 인코딩하는 방식



//1.id / pw 방식

//아이디와 비밀번호를 아래와 같은 방식으로 String 에 넣는다.

//String auth = "awxapi:ds2pass1!";

//byte[] authEncBytes = Base64.encodeBase64(auth.getBytes());

//String authStringEnc = new String(authEncBytes);



//Basic 한칸 뛰고 인코딩된 id /pw

//conn.setRequestProperty("Authorization","Basic "+authStringEnc);



//2. 토큰 방식

String AwxHeaderToken = "Bearer "+"토큰값"



conn.setRequestProperty("POST");

conn.setRequestProperty("Authorization",AwxHeaderToken);

conn.setRequestProperty("Content-Type","application/json");

conn.setRequestProperty("Accept","application/json");

conn.setConnectTimeout(5000);

conn.setDoOutput(true);



//요청시 body 사용할경우

OutputStream os = conn.getOutputStream();

os.write(epReqBody.getBytes());'

os.flush();



conn.connect();



System.out.println(conn.getResponseMessage());

int responseCode = conn.getResponseCode();

 

 

 

 

2.HttpClient 방식

 

[GET]

public void get(String requestURL) {

  try {

          HttpClient client = HttpClientBuilder.create().build(); // HttpClient 생성

          HttpGet getRequest = new HttpGet(requestURL); //GET 메소드 URL 생성

          getRequest.addHeader("x-api-key", RestTestCommon.API_KEY); //KEY 입력



          HttpResponse response = client.execute(getRequest);



          //Response 출력

          if (response.getStatusLine().getStatusCode() == 200) {

          ResponseHandler<String> handler = new BasicResponseHandler();

          String body = handler.handleResponse(response);

          System.out.println(body);

          } else {

          System.out.println("response is error : " + response.getStatusLine().getStatusCode());

          }



  } catch (Exception e){

      System.err.println(e.toString());

  }

}

 

[POST]

public void post(String requestURL, String jsonMessage) {

  try {

        HttpClient client = HttpClientBuilder.create().build(); // HttpClient 생성

        HttpPost postRequest = new HttpPost(requestURL); //POST 메소드 URL 새성

        postRequest.setHeader("Accept", "application/json");

        postRequest.setHeader("Connection", "keep-alive");

        postRequest.setHeader("Content-Type", "application/json");

        postRequest.addHeader("x-api-key", RestTestCommon.API_KEY); //KEY 입력

        //postRequest.addHeader("Authorization", token); // token 이용시



        postRequest.setEntity(new StringEntity(jsonMessage)); //json 메시지 입력



        HttpResponse response = client.execute(postRequest);



        //Response 출력

        if (response.getStatusLine().getStatusCode() == 200) {

        ResponseHandler<String> handler = new BasicResponseHandler();

        String body = handler.handleResponse(response);

        System.out.println(body);

        } else {

        System.out.println("response is error : " + response.getStatusLine().getStatusCode());

        }

  } catch (Exception e){
      System.err.println(e.toString());
  }

}

 

3.스프링 RestTemplate

 

RestTemplate restTemplate = new RestTemplate();

String loginUrl = "http://localhost:8080/organizeme/j_spring_security_check";

String username = "izeye";

String password = "1234";

MultiValueMap<String, String> parameters = new LinkedMultiValueMap<String, String>();

parameters.add("j_username", username);

parameters.add("j_password", password);

ResponseEntity<String> responseEntity = restTemplate.postForEntity(loginUrl, parameters,

String.class);

System.out.println(responseEntity);

 

Map의 경우에는 파라미터가 아니라 JSON으로 전송됨에 주의해야합니다.

 

 

 

 

 

 

 

 

 

Posted by by.타니
,

오늘은 이클립스 개발도구의 테마(배경 및 소스코드) 를 변경하는 법을 같이 알아 볼께요

사실 여러가지 테마 플러그인이 있지만 제가 여러가지 사용해본 결과 "Moonrise UI " 가장 좋다고 생각이 듭니다.

물론 이 부분은 저의 개인적인 견해입니다.

 

장시간 모니터를 바라보는 개발자 입장에서는 배경을 어둡게 하여서 눈의 피로를 조금이라도 줄이는게 좋다고 생각됩니다.

그럼 어떻게 적용할지 시작해 보도록 하겠습니다.

 

먼저 기본화면 입니다.

 

1. 이클립스를 실행한뒤에

 

https://marketplace.eclipse.org/content/eclipse-moonrise-ui-theme

 

Eclipse Moonrise UI Theme

Dark UI theme for Eclipse 4+.

marketplace.eclipse.org

 

링크로 가서 Install 부분을 드래고 한다음에 이클립스 위에다가 드래그 한다.

그러면 설치가 된다. 설치후 재부팅해준다.

 

2. 재부팅이 완료되면

메뉴바에서 [ window ] -> [ preferences ] 이동 후 [ General ] -> [ Appearance ] 이동합니다. 그 다음Theme : MoonRise로 변경 해주신 후 Apply를 클릭 해주시면 됩니다.

 

 

3.

RainbowDrops.epf
0.08MB

그 다음 첨부파일(RainbowDrops.epf) 이클립스 내에서 File > Import > General > Preferences를 통해 RainbowDrops.epf 를 불러들이면 Syntax Color까지 변경할 수 있습니다.


 

 

 

- 수동으로 적용하기

  • Manual:

    Or download moonrise_0.8.9.jar package and put it into your Eclipse \dropins\plugins\ folder;

  • Restart Eclipse and go to Window > Preferences > General > Appearance;

  • Select MoonRise (standalone) or, for a little better tabs decoration, install Eclipse 4 Chrome Theme from marketplace or from here and select MoonRise;

  • Rest your eyes ;)


Syntax highlighting scheme:

You can find the one used in the screenshot here:

Posted by by.타니
,



파일 업로드시 전체 경로 + 파일명을 받아와

파일명만 추출하고 싶을경우

 

//전체경로를 받아온다.

String url = mberManageVO.getPortfolioFile();

 

//파일명만 추출한다.
String fileName = url.substring( url.lastIndexOf('\\')+1, url.length() );

 

//확장자를 제외한 파일명을 추출한다.
String fileNameWithoutExtn = fileName.substring(0, fileName.lastIndexOf('.'));

Posted by by.타니
,

이제 본론으로.... iBatis를 이용할때 이부분 더 좋게 지원해준다.
<selectKey>를 이용하면 프로그램쪽에서 한번더 select하는 번거로움을 덜어주고 성능면에서도 조금은 도움을 줄것으로 생각된다.

* 키값이 자동증가인 경우 ...
<insert id="insertId">
  insert into MEMBER (MBR_ID, NAME) values
    ( #mbrId#, #name# )
  <selectKey keyProperty="memberSeq" resultClass="int">
    SELECT  LAST_INSERT_ID()
  </selectKey>
</insert>
Integer result = sqlMap.insert("insertId", member);

이렇게 처리하면 result에 마지막으로 추가된 키값이 담기게 된다.

* 키값이 자동증가가 아닌경우...

<insert id="insertId">
  <selectKey keyProperty="memberSeq" resultClass="int">
    SELECT MAX(MBR_SEQ) + 1 FROM MEMBER
  </selectKey>
  insert into MEMBER (MBR_SEQ, MBR_ID, NAME) values
    ( #memberSeq#, #mbrId#, #name# )
  <selectKey keyProperty="memberSeq" resultClass="int">
    SELECT  LAST_INSERT_ID()
  </selectKey>
</insert>

이와 같이 처리하면 끝.

Posted by by.타니
,

시퀀스를 생성하지 않고 ID 값으로 자동으로 insert 할때마다 자동으로 1값을 증가 시켜 놓고 싶었다

 

 

1
2
3
4
INSERT INTO school
(school_id, school_name,id_designer)
VALUES
((select ifnull(max(a.school_id), 0)+1 from school a) , #name#, #idCustomer#)

주의, mysql의 경우 하위 쿼리시 테이블에 별명을 붙여야 함

 

위에 쿼리에는 a라는 별명을 붙임.

 

 

Posted by by.타니
,

동적으로 어떠한 정보를 추가, 삭제후 Controller 에게 값을 전달하기 위한 방법

 

-html

 

<input type="hidden" value="test1" name="test">
<input type="hidden" value="test2" name="test">
<input type="hidden" value="test3" name="test">
<input type="hidden" value="test4" name="test">
<input type="hidden" value="test5" name="test">

 

위와같이 name 속성을 같게 해준다.

 

-Controller

 

private List<String> test;

 

선언하면 동적으로 생성된 input이 들어오는것을 확인할수 있다.

 

Posted by by.타니
,

특정 횟수만큼 반복하여 동일한 일을 처리한다던지 할때 사용하는것이 반복문이다. 반복문에는 for문, while문 등이 있으며
그 중에서도 for문을 가장 많이 이용하기도 한다.
특히 반복문의 경우 DB에서 리스트등을 가져와 가져온 갯수만큼 반복하여 동일한 일들을 처리할때 흔하게 사용된다고 할 수 있다.

오늘은 JSTL의 반복문인 <c:forEach> 와 <c:forTokens>에 대해 알아보자



  For 문 : <c:forEach>

 


1. 전체 속성 값 예


<c:forEach var="item" items="${list}" begin=0 end=5 step=1 varStatus="status">
    번호 : ${status.count}
    이름 : ${item.name}
    나이 : ${item.age}
    주소 : ${item.addr}
</c:forEach>



2. 속성 설명

항목

설명

비고

 var

 사용할 변수명

 필수항목

 items

 Collection 객체(List, ArrayList)

 필수항목

 begin

 시작 index. 정의되지 않을경우 0


 end

 종료 index. 정의되지 않을경우 itmes 크기 - 1

 

 step

 반복할때 이동할 index 갯수

 

 varStatus

 반복상태를 알수 있는 변수

 

 



3. varStatus 값 설명


리턴

설명

 index

 int

 items에 정의한 항목을 가리키는 index 번호이다. 0부터 시작

 count

 int

 몇번째 반복인지 나타낸다. 1부터 시작

 first

 boolean

 첫번째 반복인지 나타냄

 last

 boolean

 마지막 반복인지 나타냄

 




일반적으로 특별하게 사용할 속성이 없다면 var와 items만 이용하여 아래와 같이 사용할 수 있다.

<c:forEach var="item" items="${list}">
    이름 : ${item.name}
    나이 : ${item.age}
    주소 : ${item.addr}
</c:forEach>

 

 


 

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

 

<c:foreach> 태그 상태 속성 입니다.

속성을 이용해서 제어하면 좀더 쉽게 제어할수있습니다.

 

< c:foreach items=”${RESULT}” var=”RESULT” varStatus=”status”>

 

${status.current}<br/> <!– 현재 아이템 –>

${status.index}<br/>        <!– 0부터의 순서 –>

${status.count}<br/>        <!– 1부터의 순서 –>

${status.first}<br/>           <!– 현재 루프가 처음인지 반환 –>

${status.last}<br/>           <!– 현재 루프가 마지막인지 반환 –>

${status.begin}<br/>        <!– 시작값 –>

${status.end}<br/>         <!– 끝값 –>

${status.step}<br/>         <!– 증가값 –>

< /c:forEach>

for:each 태그의 상태를 제어함으로써, 접근이 용이해집니다

 


 


토큰을 이용한 반복문 : <c:forTokens>

 


문자열을 특정기호로 잘라내어 반복할수 있는 태그이다.
Java에서 StringTokenizer을 이용하여 토큰을 분리하여 while문을 사용하는것을 볼 수 있는데, 이와 동일한 기능을 제공한다.

<c:forTokens var="item" items="서울,대전,대구,부산,울산" delims=",">
    지역 : ${item}
</c:forTokens>

items에는 문자열을 넣고, delims 에는 분리할 기준 문자열을 넣으면 된다. 각 토큰별로 분리된 문자열은 var로 지정된 변수로 표출이 가능하다.

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

 

Posted by by.타니
,