반응형

메이븐이란 아파치에서 라이브러리를 편하게 다운로드하고 추가하고 버전 관리하기 위해 사용하는 것을 말한다.

 

프로젝트 하나에 무수한 라이브러리를 하나하나 다운받아 추가하고 필요없는건 지우고 하는일은 굉장히 고될것이다...

 

스프링 프로젝트를 하다보면 자연스럽게 pom.xml에서 메이븐을 사용하고 있었을 것인데,

가끔 자바에서만 테스트하기 위해 메이븐 프로젝트로 java파일들을 만들어서 백단에서 돌아가는 데이터를 확인할 일들이 있다.  이럴때 메이븐 심플 프로젝트를 만들어서 유용하게 사용하고 있다.

이번엔 몽고DB 데이터 조회 및 작업을 해보기 위해 생성하게 되었는데 생성방식도 포스팅한다.

 

그럼 메이븐 프로젝트를 생성해보자.

 

생성하기


1. 먼저 이클립스에서 탐색기에 오른쪽 클릭을 하고 New - Maven Project 선택을하거나 안보이는 경우 Other를 통해 선택해준다.

New - Other 선택

 

2. Maven으로 검색해본다.

Maven Project 선택

 

3. 메이븐 프로젝트 생성 위치 지정하기

   - 현재 사용중인 디렉토리에 생성시켰다.

메이븐 프로젝트 위치 지정

 

4. 메이븐 종류를 선택한다. 간단하게 자바 결과값만 확인할 것이므로 quickstart로 만들었지만 웹이 필요한분들은 webapp으로 선택하시면 됩니다. 다른것들은 필요에 따라 선택해서 생성

메이븐 템플릿 선택

 

5. 메이븐 그룹, 명 지정하기

   - Group ID는 프로젝트 구조

   - Artifact ID는 프로젝트 명이라고 생각하면 된다.

메이븐 그룹, 명 지정

 

6. Finish를 누르면 생성된다. 생성된 모습

메이븐 프로젝트 완성

 

반응형
반응형

개발을 하다보면 자주 서버의 시간을 확인하여 기준일로 두어 조회하거나 시간을 출력해주거나 다양한 용도로 사용하는데 이때마다 JAVA에서 날짜를 구하는 방식은 Calendar.getInstance(); 메소드를 활용하여 날짜를 파싱하고 변경하고 출력하는 형태였다. (1.8미만 버전)

 

날짜를 변경할때 사용하는 cal.add(); 메소드는 상수를 사용하여 매번 찾게 만들고, 번거롭고 힘든 작업이었다.

 

1.8이상의 자바를 사용중이라면 LocalDate, LocalTime, LocalDateTime등을 사용하여 훨씬 쉽게 작성이 가능하다.

 

소스를 통해 차이점을 확인해보자.

 


Calendar - 오늘 날짜 구하기

Calendar cal = Calendar.getInstance();
String format = "yyyy-MM-dd";
SimpleDateFormat sdf = new SimpleDateFormat(format);
String date = sdf.format(cal.getTime());
System.out.println(date);

 

LocalDate -  오늘 날짜 구하기

LocalDate now = LocalDate.now();
System.out.println(now);

 

오늘 날짜

 

동일한 데이터이지만 훨씬 간단하게 날짜를 호출하는걸 확인 할 수 있다.

 

그럼 LocalDate 클래스는 어떤식으로 형변환을 할 수 있을까?

- format 메소드를 활용하면 된다.

LocalDate now = LocalDate.now();
String format = now.format(DateTimeFormatter.ofPattern("yyyy.MM.dd"));

System.out.println(now);
System.out.println(format);

날짜 출력

 

 

LocalDate 클래스는 날짜 데이터, LocalTime 클래스는 시간, LocalDateTime 클래스는 시간 날짜 데이터를 가져올 수 있다.

 

서버의 현재 시간 가져오기, 제어하기

서버 날짜 및 시간 구하기


LocalDate ld = LocalDate.now();  // 날짜 구하기
System.out.println("LocalDate     > " + ld);

LocalTime lt = LocalTime.now();  // 시간 구하기
System.out.println("LocalTime     > " + lt);

LocalDateTime ldt = LocalDateTime.now();  //날짜 + 시간 구하기
System.out.println("LocalDateTime > " + ldt);

서버 날짜, 시간 구하기 출력

 

날짜를 추가, 감소하기 // 시간을 추가, 감소하기


LocalDate ld = LocalDate.now();  // 날짜 구하기
LocalDate nld = ld.plusDays(5);
System.out.println("LocalDate      > " + ld);  //현재 날짜
System.out.println("plusDate       > " + nld); //5일 뒤

LocalTime lt = LocalTime.now();  // 시간 구하기
LocalTime nlt = lt.minusHours(2);  // 시간 빼기
System.out.println("LocalTime      > " + lt); // 현재시간
System.out.println("minusHours     > " + nld); //2시간 전 시간

LocalDateTime ldt = LocalDateTime.now();  //날짜 + 시간 구하기
LocalDateTime nldt = ldt.plusDays(3).plusHours(3); //3일 + 3시간 뒤
System.out.println("LocalDateTime     > " + ldt);  // 현재 날짜 + 시간
System.out.println("3day 3hours after > " + nldt); // 3일 + 3시간 뒤 출력

날짜 제어 출력

 

plus~(), minus~() 메소드를 통하여 제어가 가능하다.

 

 

LocalDate 날짜 관련에서 사용가능 메소드


LocalDate.plusYears(long); //년추가
LocalDate.plusMonths(long); //월추가
LocalDate.plusWeeks(long); //주추가
LocalDate.plusDays(long); //일추가
LocalDate.minusYears(long); //년감소
LocalDate.minusMonths(long); //월감소
LocalDate.minusWeeks(long); //주감소
LocalDate.minusDays(long); //일감소

 

LocalTime 시간 관련에서 사용가능 메소드


LocalTime.now().plusHours(long); //시간추가
LocalTime.now().plusMinutes(long); //분추가
LocalTime.now().plusSeconds(long); //초추가
LocalTime.now().plusNanos(long); //나노초추가
LocalTime.now().minusHours(long); //시간감소
LocalTime.now().minusMinutes(long); //분감소
LocalTime.now().minusSeconds(long); //초감소
LocalTime.now().minusNanos(long); //나노초감소

 

LocalDateTime에서는 모두 사용 가능하다.

반응형
반응형

request.getrequest.getRemoteAddr() IP가 0:0:0:0:0:0:0:1로 나올 때 127.0.0.1로 인식시키는법을 알아 보겠다.

이클립스 환경 설정을 변경해주면 된다.

 

Eclipse 설정변경

Run - RRun - Run Configuration - Arguments 탭 - " -Djava.net.preferIPv4Stack=true " 추가(""빼고)

 

Run Configurations... 선택

 

 

Arguments 탭에 VM arguments: 내용을 추가한다.

 

 

 

 

설정 추가

 

저장하고 톰캣을 재부팅하면 정상적으로 127.0.0.1로 인식한다.

반응형
반응형

운영서버 운영 도중 Could not get JDBC Connection; nested exception is java.sql.SQLException

와 같은 연결 에러가 발생하였다.

 

해당 DB서버의 mysql 서비스가 종료되었는지 확인해봤지만 서비스는 정상적으로 기동중인것을 볼 수 있었다.

 

별 수 없이 재기동을 하기 위해 종료 명령어를 실행하였다.

service mysql stop

 

몇 분을 기다려도 mysql 서비스가 무기한으로 종료 요청만 진행될뿐 종료가 되지 않았다.

 

이상하다고 판단되어 서버의 용량을 확인해보니 남은 용량이 없었다.

df -h

 

서버 내 용량을 800메가 이상 사용중인곳을 확인하기 위해 아래 명령어를 실행하였다.

find ./* -size +800000k

 

명령을 입력하니 mysql/mysql-bin.000001과 같은 로그파일들이 잔득 쌓여있는 모습을 확인하였다.

 

 

해당 디렉토리로 이동하여 용량들을 확인해보니 약 30기가정도를 사용 중는데, 해당 로그들은 데이터를 지금 또는 나중에 업데이트하는 모든 명령문이 기록되어 있다.

각 명령문에 대한 데이터를 업데이트하는 시간 정보도 가지고 있는데, 사실 로그라 이미 한참 지난 불필요한 로그는 삭제처리하여도 문제가 없어서 삭제 조치를 하였다.

 

해당 로그 데이터가 5일 이상 지나면 삭제 될 수 있도록 설정파일에 옵션을 추가하였다.

 

/etc/my.cnf

[mysqld]
expire_logs_days = 5

 

5일 이상이 지난 로그파일들이 삭제되는 옵션이다.

 

삭제 후 용량을 확인시 32g가 확보되었고 정상적으로 mysql 서비스는 올라왔다.

 

이후 톰캣 재시작을 하니 정상적으로 운영이 가능해졌다.

반응형
반응형

자바에서 POI 라이브러리를 활용하여 엑셀 읽기를 해보겠다.

 

과거버전 xls가 아닌 xlsx를 다루는점 참고하길 바라며, 라이브러리는 apache에서 다운받아 사용하거나

maven추가로 사용하면 된다.

 

지금부터만드는 자바Class 및 함수는 엑셀을 읽고 List로 리턴하는 함수이다.

 

 

 

 

Maven추가


<!-- excel -->
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>3.17</version>
</dependency>	
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>3.17</version>
</dependency>

POI 3.17버전으로 사용하였다.

 

 

 

 

JAVA 엑셀을 읽는 XlsxUtils Class 생성


package egov.mongo.utils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class XlsxUtils {
	
	@SuppressWarnings("resource")
	public static List<List<String>> readToList(String path){
		List<List<String>> list = new ArrayList<List<String>>();
		
		try {
			FileInputStream fi = new FileInputStream(path);
			XSSFWorkbook workbook = new XSSFWorkbook(fi);
			XSSFSheet sheet = workbook.getSheetAt(0);
			
			for(int i=0; i<sheet.getLastRowNum(); i++) {
				XSSFRow row = sheet.getRow(i);
				if(row != null) {
					List<String> cellList = new ArrayList<String>();
					for(int j=0; j<row.getLastCellNum(); j++) {
						XSSFCell cell = row.getCell(j);
						if(cell != null) {
							cellList.add( cellReader(cell) ); //셀을 읽어와서 List에 추가
						}
					}
					list.add(cellList); // 추가된 로우List를 List에 추가
				}
			}
		}catch(FileNotFoundException e) {
			e.printStackTrace();
		}catch(IOException e) {
			e.printStackTrace();
		}
		
		return list;
	}
	
	
	@SuppressWarnings("incomplete-switch")
	private static String cellReader(XSSFCell cell) {
		String value = "";
		CellType ct = cell.getCellTypeEnum();
		if(ct != null) {
			switch(cell.getCellTypeEnum()) {
			case FORMULA:
				value = cell.getCellFormula();
				break;
			case NUMERIC:
			    value=cell.getNumericCellValue()+"";
			    break;
			case STRING:
			    value=cell.getStringCellValue()+"";
			    break;
			case BOOLEAN:
			    value=cell.getBooleanCellValue()+"";
			    break;
			case ERROR:
			    value=cell.getErrorCellValue()+"";
			    break;
			}
		}
		return value; 
	}
}

 

스트림을 통해 파라미터로 넘어온 경로를 확인하고 엑셀파일을 엑셀Workbook에 읽어서 파싱을 시작한다.

첫번째 시트만 읽도록 처리해놨다.

로우의 수만큼 차례대로 셀을 확인하여 셀의 타입을 cellReader함수에서 체크하고 List배열에 담는다.

 

 

 

 

Main.java


public class Main {

	public static void main(String[] args) {
		String filePath = "C:/test/ttt.xlsx";
		List<List<String>> readList = XlsxUtils.readToList(filePath);
		
		readList.forEach(row->{
			row.forEach(cell->{
				System.out.print(cell+", ");
			});
			System.out.println();
		});
	}
}

위 문법이 어렵다면(자바 1.8이하라면)

 

아래방법 for문으로 확인하면 된다.

public class Main {

	public static void main(String[] args) {
		String filePath = "C:/test/ttt.xlsx";
		List<List<String>> readList = XlsxUtils.readToList(filePath);
		
		for(int i=0; i<readList.size(); i++) {
			for(int j=0; j<readList.get(i).size(); j++) {
				System.out.print(readList.get(i).get(j)+", ");
			}
			System.out.println();
		}
	}
}

 

 

정상적으로 엑셀 데이터를 읽어와서 List에 담긴걸 확인할 수 있다.

엑셀 데이터

 

 

읽어온 데이터

 

반응형
반응형

깃 저장소 등 디렉토리 위치를 변경할때는 cd 명령어

cd 저장소로 사용할 위치

 

해당 위치를 로컬저장소로 지정

git init

 

 

해당 위치 로컬저장소를 삭제

rm -r .git

 

 


해당 저장소의 상태를 확인

git status

 

 


저장소에 저장하기

git add 파일명.확장자

 

추가후 상태값 확인시 new File 추가된걸 볼 수 있다.

 

 

해당 디렉토리의 모든 파일 추가하기

git add .

 

 


저장 완료하기

git commit

 

완료 하면서 메시지 남기기

git commit -m "커밋 메시지"

 

 

 


외부 저장소에 연결하기

git remote add [외부저장소명] [연결정보]

//http, https의 경우
git remote add origin https://github.com/myhappyman/gitTests

//ssh의 경우
git remote add origin ssh://접속계정@ip정보:포트/디렉토리

 

 

외부 저장소 확인하기

git remote -v

 

 

외부 저장소에 프로젝트, 파일 올리기

git push [외부 저장소명] master

 

 

외부 저장소 삭제하기

git remote rm [저장소명]

git remote rm origin //origin저장소 삭제

 

 

 


외부 저장소에서 push, pull 동작을 하기 위한 준비

mkdir /git 디렉토리 파일 생성

1. 디렉토리를 먼저 만들어준다.

 

외부 저장소에서 push, pull 동작을 하기 위한 준비

2. 외부저장소 디렉토리를 bare 공유 외부저장소를 지정 및 만들어준다.

git init --bare [생성한 디렉토리]

//ex
git init --bare /git/example.git

 

 

외부 저장소에서 프로젝트, 파일 받기 - ssh접속 다운로드

git clone ssh://계정@연결IP:ssh접속포트/디렉토리/프로젝트명

 

 

 

 


외부 저장소에서 데이터 업데이트 받기

git pull [저장소명]

git pull origin
반응형
반응형

Window에서 오픈소스 GIT 설치를 해보겠다. 아래 URL로 접근한다.

 

https://gitforwindows.org/

 

Git for Windows

Git for Windows focuses on offering a lightweight, native set of tools that bring the full feature set of the Git SCM to Windows while providing appropriate user interfaces for experienced Git users and novices alike. Git BASH Git for Windows provides a BA

gitforwindows.org

 

Donwload 버튼을 클릭하고 설치파일 다운받는다.

 

다운로드가 완료되면 실행한다.

Next

 

경로 설정 후 Next

 

기본으로 설정하고 Next (필요한 옵션이 있다면 추가 체크해준다.)

 

시작메뉴에 폴더 생성

 

에디터 설정 후 Next

 

깃의 커맨드 설정

 

깃의 SSH 실행방법 설정 기본인 OpenSSH 설정 후 Next

 

마찬가지로 기본으로 설정 후 Next

 

Checkout ending 설정 마찬가지로 기본으로 설정 후 Next

 

Next

 

옵션 선택 후 Next

 

마찬가지로 옵션 선택 후 설치를 진행한다. Install클릭

 

 

설치를 조금 기다리면...

 

설치가 완료된다.

 

 

설치 완료 후 name, email이 비어있을텐데, 이부분을 설정한다.

설치된 파일을 가서 git-bash.exe 실행

 

아래 명령으로 입력한다.

 git config --global user.name "이름"
 git config --global user.email "이메일"

 

리스트를 확인해보자.

git config --list

 

반응형
반응형

CSV(comma-separated values)는 쉼표로 구분한 텍스트 파일로 확장자가.csv로 이다.

엑셀로 읽기도 편하고 간편하게 파일을 읽고 쓰는 방식으로 쉼표로 구분되어 있는 csv파일을 자바에서 읽는 방법을 포스팅한다.

 

CsvUtils.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class CsvUtils {
	
	private static Log logger = LogFactory.getLog(CsvUtils.class);
	
	public static List<List<String>> readToList(String path) {
		List<List<String>> list = new ArrayList<List<String>>();
		File csv = new File(path);
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(csv));
			Charset.forName("UTF-8");
			String line = "";
			
			while((line=br.readLine()) != null) {
				String[] token = line.split(",");
				List<String> tempList = new ArrayList<String>(Arrays.asList(token));
				list.add(tempList);
			}
			
		} catch (FileNotFoundException e) {
			logger.error(e);
		} catch (IOException e) {
			logger.error(e);
		} finally {
			try {
				if(br != null) {br.close();}
			} catch (IOException e) {
				logger.error(e);
			}
		}
		return list;
	}
}

 

로거부분은 제외하고 봐도 무관하다.

 

파라미터로 넘어온 경로를 읽어서 csv파일을 읽고 리스트로 return처리를 하는 함수다.

 

사용 호출부분

main.java

import java.util.List;

public class Main {

	public static void main(String[] args) {
    
		String path = "csv파일이 있는 경로 지정";
		List<List<String>> list = CsvUtils.readToList(path);
		for(int i=0; i<list.size(); i++) {
			List<String> line = list.get(i);
			for(int j=0; j<line.size(); j++) {
				System.out.print(line.get(j)+",");
			}
			System.out.println();
		}
	}
}

 

csv데이터

csv 데이터

 

결과

 

한글 처리시 유의점은 UTF-8로 csv파일이 인코딩이 된 문서여야 읽힌다는 점이다.

엑셀에서 csv로 저장시에도 기본 인코딩인 유니코드로만 저장되는 점을 발견하였고, 강제 인코딩 방법으론

csv파일을 엑셀로 열지 말고 메모장으로 열어주고 다른 이름으로 저장 클릭 후 인코딩을 UTF-8로 처리하면 정상적으로 한글이 읽힌다.

 

 

반응형