MySql - 랜덤으로 정렬하기 (RAND)

*** 설명 ***
RAND() 함수를 ORDER BY 절에 사용.

*** 사용예 ***
SELECT * FROM table_name ORDER BY RAND();

MySql - 문자열을 날짜로 변경하기 (STR_TO_DATE)

*** 설명 ***
STR_TO_DATE 함수 사용
문자열 형식의 값을 날짜형식의 값으로 변경
DATE_FORMAT함수의 반대 기능

*** 사용예 ***
SELECT STR_TO_DATE('20161006182238', '%Y%m%d%H%i%s');
-> 2016-10-06 18:22:38
SELECT STR_TO_DATE('2016-10-06 18:22:38', '%Y-%m-%d %H:%i:%s');
-> 2016-10-06 18:22:38
SELECT STR_TO_DATE('2016/10/06 18:22:38', '%Y/%m/%d %T');
-> 2016-10-06 18:22:38

*** 사용되는 표현식 ***

표현식    설명
%M      월(Janeary, December, ...)
 %W     요일(Sunday, Monday, ...)
 %D      월(1st, 2dn, 3rd, ...)
 %Y      연도(1987, 2000, 2013)
 %y     연도(87, 00, 13)
 %X      연도(1987, 2000) %V와 같이 쓰임.
 %x      연도(1987, 2000) %v와 같이 쓰임.
 %a      요일(Sun, Tue, ...)
 %d      일(00, 01, 02, ...)
 %e     일(0, 1, 2, ...)
 %c      월(1, 2, ..., 12)
 %b      월(Jan, Dec, ...)
 %j      몇번째 일(120, 365)
 %H      시(00, 01, 02, 13, 24)
 %h      시(01, 02, 12)
 %i      분(00, 01, 30)
 %r      "hh:mm:ss AM|PM"
 %T      "hh:mm:ss"
 %S     초
 %s      초
 %p     AM, PM
 %w      요일(0, 1, 2) 0:일요일
 %U      주(시작:일요일)
 %u      주(시작:월요일)
 %V      주(시작:일요일)
 %v     주(시작:월요일)

Java - StringBuilder와 StringBuffer의 차이

StringBuilder와 StringBuffer의 차이는 멀티쓰레드 지원 여부.

*** StringBuilder ***
멀티쓰레드에서 동기화 지원 X
StringBuffer 보다 빠름

*** StringBuffer ***
멀티쓰레드에서 동기화 지원 O
StringBuilder 보다 느림

웹에서 이미지 편집 가능한 사이트

*** 웹 상에서  이미지 편집 기능 제공하는 사이트 ***

Pixlr Editor - Online Photo Editor
https://pixlr.com/editor/

Java - 만 나이 계산

*** 생년월일을 기준으로 현재 나이 계산 ***
 public int getAge(int birthYear, int birthMonth, int birthDay)
{
        Calendar current = Calendar.getInstance();
        int currentYear  = current.get(Calendar.YEAR);
        int currentMonth = current.get(Calendar.MONTH) + 1;
        int currentDay   = current.get(Calendar.DAY_OF_MONTH);
      
        int age = currentYear - birthYear;
        // 생일 안 지난 경우 -1
        if (birthMonth * 100 + birthDay > currentMonth * 100 + currentDay) 
            age--;
      
        return age;
}

JQuery 화면 로딩 후 버튼 클릭 이벤트 발생시키기


*** 설명 ***
화면 로딩 후 이름이 searchButton인 버튼의 클릭 이벤트를 실행

*** Sample ***
$(window).bind("load", function() {
     $("#searchButton").trigger("click");
});


   



Java - 이미지 크기 변경

String imgSourcePath= "test_image.jpg";       // 원본 이미지 파일명 (경로 포함)
String imgTargetPath= "test_imageNew.jpg";    // 새 이미지 파일명(경로 포함)
String imgFormat = "jpg";                     // 새 이미지 포맷. jpg, gif 등
int newWidth = 640;              // 새 이미지 넓이
int newHeight = 360;             // 새 이미지 높이



imgResize(imgSourcePath, newImgFilePath, imgFormat, newWidth, newHeight);


/**
 * Image Resize
 */
public void imgResize(String imgSourcePath, String imgTargetPath, String imgFormat, int newWidth, int newHeight)
{
    try
    {
        // 원본 이미지 가져오기
        Image imgSrc = ImageIO.read(new File(imgSourcePath));

        // 이미지 리사이즈
        // Image.SCALE_DEFAULT : 기본 이미지 스케일링 알고리즘 사용
        // Image.SCALE_FAST    : 이미지 부드러움보다 속도 우선
        // Image.SCALE_SMOOTH  : 속도보다 이미지 부드러움을 우선
        // Image.SCALE_AREA_AVERAGING  : 평균 알고리즘 사용
        Image resizeImage = imgSrc.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);

        // 새 이미지  저장하기
        BufferedImage newImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
        Graphics g = newImage.getGraphics();
        g.drawImage(resizeImage, 0, 0, null);
        g.dispose();
        ImageIO.write(newImage, imgFormat, new File(imgTargetPath));
    }
    catch (Exception e)
    {
    }
}

Java - URL 이미지 파일로 저장하기


String imgUrl = "http://www.a.com/test_image.jpg";  // 이미지 URL
String imgFilePath = "test_image.jpg";              // 저장할 파일명 (경로 포함)
String imgFormat = "jpg";                         // 저장할 이미지 포맷. jpg, gif 등

getImageFromUrl(imgUrl, imgFilePath, imgFormat);






/**
 * Image URL to File
 */
public void getImageFromUrl(String imgUrl, String imgFilePath, String imgFormat)
{
        try
        {
            // Image 가져오기
            BufferedImage image = ImageIO.read(new URL(imgUrl));
                       
            // Image 저장할 파일
            File imgFile = new File(imgFilePath);
           
            // Image 저장
            ImageIO.write(image, imgFormat, imgFile);
        }
        catch (Exception e)
        {
        }
}

MySql - INSERT ~ ON DUPLICATE KEY UPDATE 사용하기

*** 설명 ***
유니크 인덱스 혹은 PRIMARY KEY 값이 중복되어 인서트하지 못하는 경우 업데이트를 수행한다. 오라클의 MERGE INTO와 비슷한 기능.


*** 예제 ***
INSERT INTO TEST_TABLE (A, B, C)
  VALUES (1, 2, 3)
  ON DUPLICATE KEY UPDATE B = 4, C = 5;
=> A 컬럼이  PRIMARY KEY.
   TEST_TABLE에 A 컬럼이 1 인 행이 없으면 INSERT INTO TEST_TABLE (A, B, C) VALUES (1, 2, 3) 이, 있으면 UPDATE B = 4, C = 5 이 실행된다.


스프링 프로퍼티 사용하기

*** 설명 ***
Value 어노테이션을 사용하여 프로퍼티 값을 가져올 수 있다.
값에 따라서 String, boolean 등의 형식을 지정할 수 있다.

***예제 ***
@Value("${prop.name1}")
private String propName1;

@Value("${prop.name2}")
private boolean propName2;


Java - SHA1 샘플

* byte 데이터를 입력받아 SHA1로 변환한 결과 문자열을 리턴한다.


public static String convertSHA1(byte[] srcBytes)
    {
        try
        {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
            messageDigest.update(srcBytes);
            byte digestBytes[] = messageDigest.digest();
           
            return String.format("%0" + (2 * digestBytes.length) +  "x", new BigInteger(1, digestBytes));
        }
        catch(Exception e)
        {
        }
       
        return null;
    }

MySql - 문자열 길이 (LENGTH)

*** 문자열 길이를 구하는 함수 ***
LENGTH           : 바이트 수
CHAR_LENGTH     : 글자 수
BIT_LENGTH tprk   : 비트(1바이트는 8비트) 수


*** 예제 ***
SELECT LENGTH('대한민국'), CHAR_LENGTH('대한민국'), BIT_LENGTH('대한민국');
=>             12                    4                          96       

SELECT LENGTH('English'), CHAR_LENGTH('English'), BIT_LENGTH('English');
=>              7                   7                      56

MySql - 시간차 계산하기

*** TIMESTAMPDIFF ***
두 DATETIME 간의 시간차이를 초/분/시/일 등의 단위로 반환.

ex) 초 단위
SELECT TIMESTAMPDIFF(SECOND, NOW(), DATE_ADD(NOW(), INTERVAL 1 DAY));
==> 86400




ex) 분 단위
SELECT TIMESTAMPDIFF(MINUTE, NOW(), DATE_ADD(NOW(), INTERVAL 1 DAY));
==> 1440


ex) 시 단위
SELECT TIMESTAMPDIFF(HOUR, NOW(), DATE_ADD(NOW(), INTERVAL 1 DAY));
==> 24



ex) 일 단위
SELECT TIMESTAMPDIFF(DAY, NOW(), DATE_ADD(NOW(), INTERVAL 1 DAY));
==> 1

MySql - 문자열 자르기 (SUBSTRING)

* SUBSTRING 혹은 SUBSTR 을 사용

* SUBSTRING(문자열, 시작인덱스), SUBSTR(문자열, 시작인덱스)
시작 인덱스(1부터)부터 끝까지 문자열을 잘라서 반환.
ex) 
SELECT SUBSTRING('abcdef', 1);  => 'abcdef'
SELECT SUBSTR('abcdef', 2);     => 'bcdef'

* SUBSTRING(문자열, 시작인덱스, 길이), SUBSTR(문자열, 시작인덱스, 길이)
시작 인덱스(1부터)부터 길이만큼 문자열을 잘라서 반환.
ex) 
SELECT SUBSTRING('abcdef', 1, 3);  => 'abc'
SELECT SUBSTR('abcdef', 2, 3);     => 'bcd'

Java - split 사용시 특수문자

* split 사용시 특수문자를 사용하면 에러가 발생

String testStr = "1^2^3^4";
String[] testList = testStr.split("^");   ---> 에러

* 특수문자 앞에 \\ 을 붙이면 에러가 발생하지 않음
String[] testList = testStr.split("\\^");   --->["1", "2", "3", "4"]

MySql - IFNULL, ISNULL, IF 사용하기

*** IFNULL ***
IFNULL (VAL1, VAL2)
VAL1의 값이 null이 아니면 VAL1, null 이면 VAL2를 리턴한다.

ex)
SELECT IFNULL('VAL', 'N');   => VAL
SELECT IFNULL(NULL, 'N');   => N

*** ISNULL ***
ISNULL (VAL1)
VAL1의 값이 null이면 1(true), null이 아니면 0(false)를 리턴한다.

ex)
SELECT ISNULL('A');     => 0 (false)
SELECT ISNULL(NULL);   => 1 (true)

*** IF ***
IF (VAL1, VAL2, VAL3)
VAL1의 값이 true이면 VAL2, false이면 VAL3를 리턴한다.

ex)
SELECT IF(1, 'Y', 'N');   => Y
SELECT IF(0, 'Y', 'N');    => N
SELECT IF(TRUE, 'Y', 'N');    => Y
SELECT IF(FALSE, 'Y', 'N');    => N

MySql - 요일 구하기

*** DAYOFWEEK ***
요일을 숫자로 반환한다.
일요일 1 ~ 토요일 7

ex) SELECT DAYOFWEEK(NOW());
=> 6

*** WEEKDAY ***
요일을 숫자로 반환한다.
월요일 0 ~ 일요일 6

ex) SELECT WEEKDAY(NOW());
=> 4

MySql - date_add 사용하기

*** 설명 ***
date형식에 지정된 시간을 추가한다.


*** 사용예 ***
Syntax : DATE_ADD(date, INTERVAL expr type)

SELECT NOW(), DATE_ADD(NOW(),INTERVAL 1 MONTH)
=> 2016-04-12 08:51:03, 2016-05-12 08:51:03

SELECT NOW(), DATE_ADD(NOW(),INTERVAL -1 MONTH)
=> 2016-04-12 08:51:03, 2016-03-12 08:51:03

*** type 값 ***
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH

MySql - 날짜를 문자열로 변경하기(DATE_FORMAT)

*** 설명 ***
DATE_FORMAT 함수 사용
날짜형식의 값을 문자열 형식의 값으로 변경
STR_TO_DATE 함수의 반대 기능

*** 사용예 ***
SELECT DATE_FORMAT(NOW(),'%Y%m%d%H%i%s');
-> 20160401083246
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s');
-> 2016-04-01 08:35:45
SELECT DATE_FORMAT(NOW(),'%Y/%m/%d %T');
->2016/04/01 08:36:08

*** 사용되는 표현식 ***

표현식 설명
%M   월(Janeary, December, ...)
 %W  요일(Sunday, Monday, ...)
 %D   월(1st, 2dn, 3rd, ...)
 %Y   연도(1987, 2000, 2013)
 %y  연도(87, 00, 13) 
 %X   연도(1987, 2000) %V와 같이 쓰임.
 %x   연도(1987, 2000) %v와 같이 쓰임.
 %a   요일(Sun, Tue, ...)
 %d   일(00, 01, 02, ...)  
 %e  일(0, 1, 2, ...) 
 %c   월(1, 2, ..., 12)  
 %b   월(Jan, Dec, ...) 
 %j   몇번째 일(120, 365) 
 %H   시(00, 01, 02, 13, 24) 
 %h   시(01, 02, 12)
 %i   분(00, 01, 30) 
 %r   "hh:mm:ss AM|PM" 
 %T   "hh:mm:ss" 
 %S  초 
 %s   초 
 %p  AM, PM 
 %w   요일(0, 1, 2) 0:일요일 
 %U   주(시작:일요일) 
 %u   주(시작:월요일) 
 %V   주(시작:일요일) 
 %v  주(시작:월요일) 


MySql - limit 사용하기

*** 사용법1 ***
LIMIT 정수
쿼리 실행 결과의 갯수를 제한한다.


예제)
select * from TABLE_NAME limit 5;

*** 사용법2 ***
LIMIT 정수, 정수
쿼리 실행 결과를 지정된 인덱스부터 지정된 갯수만큼 조회한다.
첫번째 정수는 시작 인덱스를 지정. 0부터 시작.
두번째 정수는 결과 갯수를 지정.

예제)
select * from TABLE_NAME limit 0, 5;

Java - 날짜 포맷 (FastDateFormat)

*** 설명 ***
기존 SimpleDateFormat 보다 빠름.
Thread Safe.
Apache Commons Lang 라이브러리 필요.

*** 사용예 ***
FastDateFormat fdf = FastDateFormat.getInstance("yyyyMMdd");
System.out.println("FastDateFormat =" + fdf.format(Calendar.getInstance()));

*** maven repository ***
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>

Oracle - UNION, UNION ALL

*** UNION ***
두 테이블을 결합한 결과를 반환하는데 중복되지 않는 값들만 반환.
결과는 정렬되어서 반환.


*** UNION ALL ***
두 테이블을 결합한 결과를 반환하는데 중복되는 값들도 모두 반환.


ex) 
TABLE_1                           TABLE_2
---------                         ---------
COL_A                              COL_A
---------                         ---------
1                                         3
2                                         2
3                                         1

select COL_A from TABLE_!
union
select COL_A from TABLE_2
=> 결과
1
2
3

select COL_A from TABLE_!
union all
select COL_A from TABLE_2
=> 결과
1
2
3
3
2
1

MyBatis 동적 쿼리 - choose

*** choose 문 ***
스위치 구문과 비슷. 여러 조건을 순서대로 체크하여 해당하는 조건의 구문을 추가.
해당되는 조건이 없을 경우 otherwise에 해당하는 구문을 추가

ex)
<select id="testSql" parameterType="hashmap" resultType="hashmap">
    select
        ID, NAME
    from
        T_TEST A
    where USE_YN = 'Y'
    <choose>       
        <when test="type == 'A' ">
            and TYPE = 'A'
        </when>       
        <when test="type == 'B' ">
            and TYPE = 'B'
        </when>
        <otherwise>
            and TYPE = 'C'
        </otherwise>
    </choose>
</select>

interface 형식
@Select("<script>"
    + "select "
    + " ID, NAME "
    + "from T_TEST A "
    + "where USE_YN = 'Y' "
    + " <choose>"
    + "   <when test=\"type == 'A'\"> TYPE = 'A' </when>"
    + "   <when test=\"type == 'B'\"> TYPE = 'B' </when>"
    + "   <otherwise> TYPE = 'C' </otherwise>"
    + " </choose>"
    + "</script> ")
List<HashMap> select(@Param("type")String type);

MyBatis 동적 쿼리 - if

*** if 문 ***
조건을 만족하는 경우 추가

ex) type 값이 null이 아니고, 빈값이 아닐때 조건에 추가
xml 형식
<select id="testSql" parameterType="hashmap" resultType="hashmap">
    select
        ID, NAME
    from
        T_TEST A
    where USE_YN = 'Y'
    <if test="type != null and type != ''"> and TYPE = #{type} </if>
</select>

interface 형식
@Select("<script>"
    + "select "
    + " ID, NAME "
    + "from T_TEST A "
    + "where USE_YN = 'Y' "
    + "<if test=\"type != null and type != ''\"> and TYPE = #{type} </if>"
    + "</script> ")
List<HashMap> select(@Param("type")String type);