반응형

오라클 설치에 대해 알아보겠습니다.

 

https://www.oracle.com/index.html

 

Oracle | Integrated Cloud Applications and Platform Services

About Oracle Unlock endless possibilities A culture of innovation has propelled Oracle since its inception. Today, thanks to exceptional people, we lead the market in autonomous, cloud, and applications technologies.

www.oracle.com

공식 홈페이지로 이동

 

하단의 Developers로 이동

 

 

Databases로 이동

 

오라클 데이터베이스 클릭

 

많은 버전들이 보일 텐데 여기서 원하는 버전으로 설치하면 된다.

우리는 11g버전으로 설치를 할것이니 맨 아래로 내려보면 11g가 존재한다.

자신의 OS환경에 올바른 버전의 파일1, 2를 다운받는다.

파일1, 2 다운로드

 

 

한번에 이동하는 URL도 남겨 둡니다.(url이 변경될 수도 있음)

https://www.oracle.com/database/technologies/oracle-database-software-downloads.html

 

Database Software Downloads | Oracle

Oracle Database 11g Release 2 Standard Edition, Standard Edition One, and Enterprise Edition 7/13: Patch Set 11.2.0.4 for Linux and Solaris is now available on support.oracle.com. Note: it is a full installation (you do not need to download 11.2.0.1 first)

www.oracle.com

 

설치방법은 추가예정...

반응형
반응형

작성한 테이블에 대해서 결과값을 뽑는 쿼리는 아래와 같다.

SELECT
	ORDINAL_POSITION `번호`,
	COLUMN_NAME `컬럼`,
	COLUMN_TYPE `타입(길이)`,
	COLUMN_KEY `KEY`,
	IS_NULLABLE `NULL 허용`,
	EXTRA `AUTO_INCREMENT`,
	COLUMN_DEFAULT `기본값`,
	COLUMN_COMMENT `COMMENT`
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = '데이터베이스명' AND TABLE_NAME = '테이블명'
ORDER BY TABLE_NAME, ORDINAL_POSITION

 

이 외에도 다른 컬럼값들이 있는데, 변경해서 사용하면 된다.

반응형
반응형

mysql 서버를 구성하고 웹에서 데이터를 조회해오는데 문제없이 잘 가져오다가

빈 컬럼이거나 NULL이 들어가있으면 Case When문구를 활용하여 치환하는 query가 있었는데

 

툴로 조회할때는 문제가 없지만, mybatis를 통해 조회할때만 문제가 되었다.

 

처음 의심한 곳은 mapper의 xml 인코딩이 깨졌을꺼라 생각했지만 문제없이 UTF-8 처리였다.

 

SET CHARACTER SET UTF8;

해당 쿼리를 던지고 조회하면 수정이 된다고해서 처리하였지만 동일한 증상이 발생하였고,

 

mysql -u root -p
비밀번호 입력

접속하여 status로 서버쪽 언어 인코딩 상태를 확인해보니 latin1로 조회되었다.

 

status 조회 결과

 

서버쪽 인코딩이 안맞는것으로 판단하여 mysql 설정파일인 my.ini를 열어

mysqld라인에 character-set-server=utf8 를 입력하였다.

[mysqld]
character-set-server=utf8

 

서비스에서 mysql 재기동 후 정상적으로 치환하여 보여지는것을 확인했다.

 

반응형
반응형
mysql -u root -p
비밀번호입력

mysql을 접근 후

 

use mysql;
select host, user, password from user;

접근하려는 계정과 host의 값을 확인한다.

 

외부 어디에서든 접근하려면 권한이 필요한대, 아래와 같이 쿼리를 추가한다.

grant all privileges on *.* to 'root'@'%' identified by '패스워드';

 

%는 어디서든 접근을 하게 해주겠다는 뜻이다.

 

grant all privileges on *.* to 'root'@'118.50.20.%' identified by '패스워드';

118.50.20으로 시작하는 연결을 허용하겠다는 뜻이다.

 

원하는 형태로 허용처리를 해주고 갱신을 해준다.

 

flush privileges;

 

 

이렇게 설정하고도 연결이 안되면 bind-address값을 확인한다.

my.ini에 설정파일에서 bind-address값이 127.0.0.1과 같이 내부에서만 접근하도록 되어있다면 주석 또는 0.0.0.0

처리를 하여 외부에서 접근할 수 있게 풀어준다.

[my.ini]
bind-address=0.0.0.0

 

이렇게까지 하고도 연결이 안되면 방화벽을 의심해봐야 한다.

 

해당 포트의 인바운드쪽에서 3306이 허용이 되어있는지 확인한다.

반응형
반응형

mysql 서비스를 종료 후 재기동을 하려고 하니 위와 같은 에러가 발생하고

 

my.ini 옵션에 bind-address를 추가하여도 동일하게 문제가 발생하였다.

 

명령 프롬프트를 관리자 권한으로 실행하고 mysql 설치된 위치로 이동하여

bin 위치에서 (C:\Program Files\MySQL\MySQL Server 8.0\bin)

 

mysqld --initialize

입력 후 약간의 시간이 지난 후

 

net start mysql

입력하여 서비스를 정상적으로 기동하였다.

반응형
반응형

Java 1.8버전 이하에서는 날짜를 구하려면 Calendar 객체를 호출하고 데이트포맷을 설정하여 문자열로 받아와 출력을 해줘야 한다.

Java에서 날짜를 구하는 함수를 만들어서 공유하고자 포스팅한다.

 

오늘 날짜 구하기

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

오늘날짜

 

어제 날짜 구하기 - Calendar.add() 메소드 활용

Calendar cal = Calendar.getInstance();
String format = "yyyy-MM-dd";
SimpleDateFormat sdf = new SimpleDateFormat(format);
cal.add(cal.DATE, -1); //날짜를 하루 뺀다.
String date = sdf.format(cal.getTime());
System.out.println(date);

어제

 

내일 날짜 구하기 - Calendar.add() 메소드 활용

Calendar cal = Calendar.getInstance();
String format = "yyyy-MM-dd";
SimpleDateFormat sdf = new SimpleDateFormat(format);
cal.add(cal.DATE, +1); //날짜를 하루 더한다.
String date = sdf.format(cal.getTime());
System.out.println(date);

내일

 

세달 전 날짜 구하기 - Calendar.add() 메소드 활용

Calendar cal = Calendar.getInstance();
String format = "yyyy-MM-dd";
SimpleDateFormat sdf = new SimpleDateFormat(format);
cal.add(cal.MONTH, -3); //세달 전
String date = sdf.format(cal.getTime());
System.out.println(date);

세달 전

 

이와 같이 Calendar 객체의 add() 메소드를 활용하여 원하는 날짜를 구하면 된다.

 

아래는 매번 호출하고 사용하는게 번거로워 만들어놓은 자바소스를 공유한다.

DateUtils.getDate()메소드에 cal Instanse객체를 넣고 원하는 날짜 이전, 이후 날짜를 입력하면 데이터가 호출된다.

 


 

Main.java

public static void main(String[] args){
    Calendar calendar = Calendar.getInstance();
    //오늘
    String today = DateUtils.getDate(cal, "date"); //오늘
    String yesterday = DateUtils.getDate(cal, "date", "date", -1); //어제
    String before4Day = DateUtils.getDate(cal, "date", "date", -4); //4일전
    String month = DateUtils.getDate(cal, "month"); //이번달
    String beforeMonth = DateUtils.getDate(cal, "month", "month", -1); //지난달
    String year = DateUtils.getDate(cal, "year"); //올해
    String before3year = DateUtils.getDate(cal, "year", "year", -3); //3년전
    System.out.println(today);
    System.out.println(yesterday);
    System.out.println(before4Day);
    System.out.println(month);
    System.out.println(beforeMonth);
    System.out.println(year);
    System.out.println(before3year);
}

 

DateUtils.java

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class DateUtils {
	
	private static final String F_YEAR = "yyyy";
	private static final String F_MONTH = "yyyy.MM";
	private static final String F_MONTH2 = "yyyy-MM";
	private static final String F_DATE = "yyyy.MM.dd";
	private static final String F_DATE2 = "yyyy-MM-dd";
	private static final String F_TIMESTAMP = "yyyy.MM.dd HH:mm:ss";

	/*******************************/
	/********** 공통사용 함수 **********/
	/*******************************/
	
	/**
	 * 날짜 출력 함수
	 * @param cal
	 * @param type
	 * @return
	 */
	public static String getDate(Calendar cal, String type) {
		return getDateFormatter(type).format(cal.getTime());
	}
	
	/**
	 * 날짜 출력 함수(이전 날짜 전용)  ex)어제, 일주일전, 지난달, 작년 등
	 * @param cal
	 * @param type
	 * @param before
	 * @param beforeValue
	 * @return
	 */
	@SuppressWarnings("static-access")
	public static String getDate(Calendar cal, String type, String before, int beforeValue){
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(cal.getTime());
		SimpleDateFormat sdf = getDateFormatter(type);
		
		if(before != null && !before.trim().equals("")) {
			int beforeType = 0;
			before = before.trim().toLowerCase();
			switch(before) {
			case "year"://년
				beforeType = calendar.YEAR;
				break;
			case "month"://월
				beforeType = calendar.MONTH;
				break;
			case "week"://주
				beforeType = calendar.DATE;
				break;
			case "date"://일
				beforeType = calendar.DATE;
				break;
			}
			calendar.add(beforeType, beforeValue);
		}
		String date = sdf.format(calendar.getTime());
		return date;
	}
	
	/**
	 * SimpleDateFomat형 날짜 포맷용 설정 상수에서 가져옴
	 * @param type
	 * @return
	 */
	public static SimpleDateFormat getDateFormatter(String type) {
		if(type != null) {
			type = type.trim().toLowerCase();
			switch(type) { //상단에 선언된 상수 String형 포맷을 받아온다.
			case "year":
				type = F_YEAR;
				break;
			case "month":
				type = F_MONTH;
				break;
			case "month2":
				type = F_MONTH2;
				break;
			case "week":
				type = F_DATE;
				break;
			case "date":
				type = F_DATE;
				break;
			case "date2":
				type = F_DATE2;
				break;				
			case "timestamp":
				type = F_TIMESTAMP;
				break;
			}
			SimpleDateFormat sdf = new SimpleDateFormat(type);
			return sdf;
		}else {
			return null;
		}
	}
}

 

표시하고자 하는 형태의 구분자는 상수값에서 변경해서 쓰시면 됩니다.

ex)

private static final String F_DATE = "yyyy.MM.dd";

-> private static final String F_DATE = "yyyy-MM-dd";

반응형
반응형

HttpServletRequest 으로 넘어오는 모든 request값을 확인하는 방법으로 getParamterNames() 메소드가 존재한다.

 

바로 소스를 통해 확인해보자.

Enumeration params = request.getParameterNames();
while(params.hasMoreElements()) {
  String name = (String) params.nextElement();
  System.out.print(name + " : " + request.getParameter(name) + "     "); 
}
System.out.println();

 

해당 방법을 통하여 key, value값을 쉽게 확인 할 수 있다.

반응형
반응형

2020-01-10 내용추가)

- 해당 글에 대한 내용을 추가합니다.

innerHTML과 append() 메소드의 원천적인 동작 비교를 잘 못한거 같습니다.

jQuery와 dom의 동작을 비교하려고 썻던 포스팅인데 정확하게 알아보지 않았던게 문제가 되었습니다.

애초에 javascript자체에 element.append()가 존재하며 jquery에는 innerHTML과 기능이 비슷한 html()이라는 메소드가 존재합니다.

굳이 비교하려면 element.innerHTML, $().html() // element.append(""), $().append()를 비교하는게 맞을거 같고

좀 더 정확하게는 append()와 html()차이정도로 해당 포스트를 참고하시면 좋을 것 같습니다.


 

일반적으로 dom은 jquery보다 속도면에서 훨등히 빠르고, jquery는 dom보다는 표현식이 간단한 차이가 있다.

 

또한 append는 타겟을 지정하여 데이터를 처리하면 처리한 태그가 추가로 처리되며

innerHTML은 타겟의 모든 데이터를 덮어씌운다.

하지만 이부분은 innerHTML += "추가할 데이터" 이러한 방법으로 대처가 가능하다.

 

이 부분에서 가장 해서는 안되는 방법으로 반복문 내부에 append 또는 innerHTML += 처리를 하는 것이다...

 

안좋은 방식)

for(i=0; i<1000; i++){
	var tag = "<div id='test'+i>"+i+"</div>";
	$("#innerTable").append(tag);
}

 

위 소스는 데이터가 커지고 그려야 할 태그가 많아지면 굉장히 위험해지는 방법이다.

브라우저에 굉장히 큰 부담을 주어 실행속도가 현저히 느려지며 생성하는데 굉장히 느려진다.

 

추천 방식)

var tag = "";
for(i=0; i<1000; i++){
	tag += "<div id='test'+i>"+i+"</div>";
}
$("#innerTable").append(tag);

빈 문자열 변수를 선언하여 해당 문자열에만 추가하는것이 좋은 방법이다.

 

신입일 당시 반복문 내부에서 미친듯이 찍어대는 append덕분에 클라이언트 브라우저가 심심하면 강제종료 되거나 멈추는 일이 있었는데 당시의 경험 덕분에 좋은 공부가 되었다.

 

이외에 추가적으로 차이점을 확인해보겠다.

 

예제)

<form id="searchForm" name="searchForm" method="post">
  <input type="hidden" name="page" value="">
  <select name="telecom">
    <option value="">선택</option>
    <option value="1">010</option>
    <option value="2">016</option>
    <option value="3">019</option>
  <select>
  <input type="text" name="user">
  <button type="button" id="searchBtn">조회</button>
</form>

form태그로 이루어진 html이다.

 

$("#searchList").click(function(){
  var form = document.searchForm;

  //dom innerHTML으로 처리하면 select선택된 값이나 입력된 값을 유지를 못함
  //document.getElementById("searchForm").innerHTML = "<input value='" + token + "' name='_token' type='hidden'>";

  $("#searchForm").append("<input type='hidden' name='_token' value='" + token + "'>");
  form.page.value = 1;
  form.action = context_path + "/action.do";

  form.submit();
});

조회 버튼을 클릭하게 되면 form태그 내부에 암호화 토큰값을 처리하고 조회를 하러 컨트롤러영역인 action.do로 이동한는 간단한 소스이다.

 

하지만 소스의 append가 아닌 innerHTML로 처리시 정상적으로 동작이 되질 않았다.

이유를 확인해보자면 innerHTML += 이부분이 문제가 되었는데, select박스에서 선택한 값이 초기화되어 컨트롤러로 넘어가게 되었고 request.parameter로 select로 넘어온 값을 아무리 확인하여도 조회가 되지 않는 현상이다.

 

반대로 append를 사용하게되면 태그만 추가되면서 암호화키값까지 추가되면서 문제없이 동작이 된다.

 

즉, 사용자(클라이언트)가 처리한 값을 유지하느냐 못하느냐의 차이가 있다.

 

이러한 저장기능을 지원하기 때문에 jquery 라이브러리는 dom보다 아무래도 속도면에서 떨어지지 않을까 논리적으로 이해가 되었다.

 

 

 

반응형