참조1 : https://www.youtube.com/watch?v=Yyr451RBB6g    참조2 : https://www.youtube.com/watch?v=foC6t8dZHls

1. void형 interface의 lambda 표현

package com.donzbox._01_Void;

/*
 * Lambda 표현식 : 여러줄의 코드를 메소드에 때려넣는 기법 (java 8~)
 * Lambda식 제약 : 반드시 인터페이스에는 하나의 메소드만 존재해야 함
 */
interface Say {
	void something();
}
class Person {
	public void greeting(final Say line) {
		line.something();
	}
}
public class Application {
	public static void main(final String [] args) {
		Person person = new Person();
		/*
		 * 익명클래스란 : 1회성 자식 클래스
		 *               Say 인터페이스 클레스를 객체화 시킬때
		 *               메소드 내용이 없으므로 내용을 만들어 주어야 한다.
		 *               something() 메소드를 override하여 재정의 함으로써
		 *               Say 인터페이스 클레스의 자식클래스로 만들 수 있다.
		 *               하지만 만들어진 자식클래스의 이름이 없으므로 익명클래스라 칭한다.
		 */
		// 01. 익명 class의 객체화
		person.greeting(new Say() {
			@Override
			public void something() {
				System.out.println("Say yea~");
			}
		});
		// 02. Lambda
		person.greeting(() -> {
			System.out.println("Say Lambda~");
		});
	}
}

2. return 값이 있는 interface의 lambda

package com.donzbox._02_Return;

interface Say {
	int something();
}
class Person {
	public void greeting(final Say line) {
		int num = line.something();
		System.out.println(num);
	}
}
public class Application {
	public static void main(final String [] args) {
		Person person = new Person();
		// 01. 익명 class의 객체화
		person.greeting(new Say() {
			@Override
			public int something() {
				return 1;
			}
		});
		// 02. Lambda
		person.greeting(() -> {
			return 2;
		});
	}
}

3. parameter가 1개인 interface의 lambda 표현

package com.donzbox._03_Parameter1;

interface Say {
	int something(int a);
}
class Person {
	public void greeting(final Say line) {
		int num = line.something(3);
		System.out.println(num);
	}
}
public class Application {
	public static void main(final String [] args) {
		Person person = new Person();
		// 01. 익명 class의 객체화
		person.greeting(new Say() {
			@Override
			public int something(final int a) {
				return a -1;
			}
		});
		// 02. Lambda
		person.greeting(a -> {
			return a -2;
		});
	}
}

4. parameter가 2개 이상인 interface의 lambda 표현

package com.donzbox._04_Parameter2;

interface Say {
	int something(int a, int b);
}
class Person {
	public void greeting(final Say line) {
		int num = line.something(3, 4);
		System.out.println(num);
	}
}
public class Application {
	public static void main(final String [] args) {
		Person person = new Person();
		// 01. 익명 class의 객체화
		person.greeting(new Say() {
			@Override
			public int something(final int a, final int b) {
				return a + b;
			}
		});
		// 02. Lambda
		person.greeting((a, b) -> {
			return b - a;
		});
	}
}

5. interface가 2개 이상일 때 lambda 표현

package com.donzbox._05_Interface2;

interface Say {
	void something(int a, int b);
}
interface Hello {
	// Functional Interface : 인터페이스에 메소드가 하나밖에 없는것
	void something(String a, String b);
}
class Person {
	public void greeting(final Say line) {
		line.something(3, 4);
	}
	public void greeting(final Hello line) {
		line.something("3", "4");
	}
}
public class Application {
	public static void main(final String [] args) {
		Person person = new Person();
		// 01. 익명 class의 객체화
		person.greeting(new Say() {
			@Override
			public void something(final int a, final int b) {
				System.out.println(a + b);
			}
		});
		// 02. Lambda
		person.greeting((final String a, final String b) -> {
			System.out.println(b + "&" + a);
		});
	}
}



참조 : http://woowabros.github.io/tools/2017/07/10/java-enum-uses.html

1. 데이터들 간의 연관관계 표현

Worse Case

package com.donzbox._01_Relation._1_WorseCase;

class LegacyCase {
	public String getValue01(final String value) {
		if("Y".equals(value)) {
			return "1";
		} else {
			return "2";
		}
	}
	public boolean getValue02(final String value) {
		if("Y".equals(value)) {
			return true;
		} else {
			return false;
		}
	}
}

public class _Application {
	public static void main(final String [] args) {
		LegacyCase lc = new LegacyCase();
		/*
		 * 01. “Y”, “1”, true는 모두 같은 의미라는 것을 알 수 없습니다.
		 *      Y란 값은 “1”이 될 수도 있고, true가 될 수도 있다는 것을 확인하려면 항상 위에서 선언된 클래스와 메소드를 찾아야만 합니다.
		 * 02. 불필요한 코드량이 많습니다.
		 *      Y, N 외에 R, S 등의 추가 값이 필요한 경우 if문을 포함한 메소드 단위로 코드가 증가하게 됩니다.
		 *      동일한 타입의 값이 추가되는것에 비해 너무 많은 반복성 코드가 발생하게 됩니다.
		 */
		System.out.println(lc.getValue01("Y"));
		System.out.println(lc.getValue02("N"));
	}
}

Best Case

package com.donzbox._01_Relation._2_BestCase;

enum Value {
	Y("1", true),
	N("0", false);

	private String value01;
	private boolean value02;

	Value(final String value01, final boolean value02) {
		this.value01 = value01;
		this.value02 = value02;
	}

	public String getValue01() {
		return value01;
	}
	public boolean getValue02() {
		return value02;
	}
}

public class _Application {

	public static void main(final String [] args) {
		/*
		 * “Y”, “1”, true 가 한 묶음으로, “N”, “0”, false가 한 묶음이 된 것을 코드로 바로 확인할 수 있습니다.
		 * 또한 추가 타입이 필요한 경우에도 Enum 상수와 get메소드만 추가하면 됩니다.
		 */
		Value value = Value.Y;
		System.out.println(value.getValue01());
		System.out.println(value.getValue02());
	}
}

2. 상태와 행위를 한곳에서 관리

Worse Case

package com.donzbox._02_StatusAction._1_WorseCase;

class Calculator {
	public static long calculate(final String code, final long value) {
		if("CALC_x1".equals(code)) {
			return value*1;
		} else if("CALC_x5".equals(code)) {
			return value*5;
		} else if("CALC_x9".equals(code)) {
			return value*9;
		} else {
			return 0;
		}
	}
}

public class _Application {
	public static void main(final String [] args) {
		/*
		 * 코드는 코드대로 조회하고
		 * 계산은 별도의 클래스&메소드를 통해 진행해야 함
		 * Calculator의 메소드와 code는 서로 관계가 있음을 코드로 표현할 수가 없기 때문
		 * Code에 따라 지정된 메소드에서만 계산되길 원하는데, 현재 상태로는 강제할 수 있는 수단이 없음
		 *
		 * 01. 똑같은 기능을 하는 메소드를 중복 생성할 수 있습니다.
		 *     히스토리가 관리 안된 상태에서 신규화면이 추가되어야 할 경우 계산 메소드가 있다는 것을 몰라 다시 만드는 경우가 빈번합니다.
		 *     만약 기존 화면의 계산 로직이 변경 될 경우, 신규 인력은 2개의 메소드의 로직을 다 변경해야하는지, 해당 화면만 변경해야하는지 알 수 없습니다.
		 *     관리 포인트가 증가할 확률이 매우 높습니다.
		 * 02. 계산 메소드를 누락할 수 있습니다.
		 *     결국 문자열과 메소드로 분리 되어 있기 때문에 이 계산 메소드를 써야함을 알 수 없어 새로운 기능 생성시 계산 메소드 호출이 누락될 수 있습니다.
		 */
		String someOutput = "CALC_x5";
		long someValue = 10000L;
		System.out.println(Calculator.calculate(someOutput, someValue));
	}
}

Best Case

package com.donzbox._02_StatusAction._2_BestCase;

import java.util.function.Function;

enum CalculatorCode {

	/* 
	 * java7 (상수별 메소드) 구현
	 * Enum의 필드로 추상메소드를 선언하고, 이를 상수들이 구현하도록 하면
	 * Java8의 Function 인터페이스를 사용한 것과 동일한 효과를 보실수 있습니다.
		CALC_x1 {
			long calculate(long value) { return value*1; }
		},
		CALC_x5 {
			long calculate(long value) { return value*5; }
		},
		CALC_x9 {
			long calculate(long value) { return value*9; }
		},
		CALC_xx {
			long calculate(long value) { return 0L; }
		};
		abstract long calculate(long value);
	 */

	// java8 구현
	CALC_x1(value -> value*1),
	CALC_x5(value -> value*5),
	CALC_x9(value -> value*9),
	CALC_xx(value -> 0L);

	private Function<Long, Long> expression;
	CalculatorCode(final Function<Long, Long> expression) {
		this.expression = expression;
	}
	public long calculate(final long value) {
		return expression.apply(value);
	}
}

public class _Application {
	public static void main(final String [] args) {
		/*
		 * “DB의 테이블에서 뽑은 특정 값은 지정된 메소드와 관계가 있다.”
		 * 역활과 책임이라는 관점으로 봤을때, 위 메세지는 Code에 책임이 있음
		 * Entity 클래스에 선언하실 경우에는 String이 아닌 enum을 선언
		 */
		CalculatorCode code = CalculatorCode.CALC_x5;
		long someValue = 10000L;

		/*
		 * 값(상태)과 메소드(행위)가 어떤 관계가 있는지에 대해 더이상 다른 곳을 찾을 필요가 없음
		 * 코드내에 전부 표현되어 있고, Enum 상수에게 직접 물어보면 되기 때문
		 */
		System.out.println(code.calculate(someValue));
	}
}

3. 데이터 그룹관리

Worse Case

package com.donzbox._03_DataGroup._1_WorseCase;

class PayGroup {
	public static String getPayGroup(final String code) {
		if("계좌이체".equals(code) || "무통장입금".equals(code) || "현장결재".equals(code) || "토스".equals(code)) {
			return "현금";
		}
		else if("신용카드".equals(code) || "카카오페이".equals(code) || "페이코".equals(code) || "배민페이".equals(code)) {
			return "카드";
		}
		else if("포인트".equals(code) || "쿠폰".equals(code)) {
			return "기타";
		} else {
			return "없음";
		}
	}
}

public class _Application {
	public static void main(final String [] args) {
		/*
		 * 01. 둘의 관계를 파악하기가 어렵습니다.
		 *     위 메소드는 포함관계를 나타내는 것일까요? 아니면 단순한 대체값을 리턴한것일까요?
		 *     현재는 결제종류가 결제수단을 포함하고 있는 관계인데, 메소드만으로 표현이 불가능합니다.
		 * 02. 입력값과 결과값이 예측 불가능합니다.
		 *     결제 수단의 범위를 지정할수 없어서 문자열이면 전부 파라미터로 전달 될 수 있습니다.
		 *     마찬가지로 결과를 받는 쪽에서도 문자열을 받기 때문에 결제종류로 지정된 값만 받을 수 있도록 검증코드가 필요하게 됩니다.
		 * 03. 그룹별 기능을 추가하기가 어렵습니다.
		 *     결제 종류에 따라 추가 기능이 필요할 경우 현재 상태라면 어떻게 구현 할수 있을까요?
		 *     또다시 결제종류에 따른 if문으로 메소드를 실행하는 코드를 작성해야 할까요?
		 */
		String payCode = "배민페이";
		String payMethod = PayGroup.getPayGroup(payCode);
		System.out.println(payMethod);

		/*
		 * 각각의 메소드는 원하는 떄에 사용하기 위해 독립적으로 구성할 수 밖에 없는데,
		 * 그럴때마다 결제종류를 분기하는 코드가 필수적으로 필요하게 됩니다.
		 * 이건 좋지 못한 방법이라는 생각이였습니다.
		 */
		if("현금".equals(payMethod)) {
			System.out.println(payMethod + "로직수행");
		} else if("카드".equals(payMethod)) {
			System.out.println(payMethod + "로직수행");
		} else if("기타".equals(payMethod)) {
			System.out.println(payMethod + "로직수행");
		} else {
			System.out.println("로직수행안함");
		}
	}
}

Good Case

package com.donzbox._03_DataGroup._2_GoodCase;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

enum PayGroup {
	/* 결제수단이 문자열인 것입니다.
	 * DB 테이블의 결제수단 컬럼에 잘못된 값을 등록하거나,
	 * 파라미터로 전달된 값이 잘못되었을 경우가 있을 때 전혀 관리가 안됩니다.
	 * 그래서 이 결제수단 역시 Enum으로 전환하여야 함
	 */
	CASH("현금", Arrays.asList("계좌이체", "무통장입금", "현장결재", "토스")),
	CARD("카드", Arrays.asList("신용카드", "카카오페이", "페이코", "배민페이")),
	ETC("기타", Arrays.asList("포인트", "쿠폰")),
	EMPTY("없음", Collections.emptyList());

	private String title;
	private List<String> payList;
	PayGroup(final String title, final List<String> payList) {
		this.title = title;
		this.payList = payList;
	}

	/*
	 * 각 Enum 상수들은 본인들이 갖고 있는 문자열들을 확인하여
	 * 문자열 인자값이 어느 Enum 상수에 포함되어있는지 확인할 수 있게 되었습니다.
	 */
	public static PayGroup findByPayCode(final String code) {
		//PayGroup의 Enum 상수들을 순회하며
		return Arrays.stream(PayGroup.values())
				// payCode를 갖고 있는지 확인
				.filter(payGroup -> payGroup.hasPayCode(code))
				.findAny()
				.orElse(EMPTY)
				;
	}
	public boolean hasPayCode(final String code) {
		return payList.stream()
				.anyMatch(payCode -> payCode.equals(code));
	}
	public String getTitle() {
		return title;
	}
}

public class _Application {
	public static void main(final String [] args) {
		// 관리 주체를 PayGroup에게 준 결과로, 이젠 PayGroup에게 직접 물어보면 됩니다.
		String payCode = "배민페이";
		PayGroup payGroup = PayGroup.findByPayCode(payCode);
		System.out.println(payGroup.name());
		System.out.println(payGroup.getTitle());
	}
}

Best Case

package com.donzbox._03_DataGroup._3_BestCase;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

enum PayType {
	/*
	 * DB 혹은 API에서 PayType으로 데이터를 받아,
	 * 타입 안전성까지 확보하여 PayGroup 관련된 처리를 진행할 수 있게 되었습니다.
	 */
	ACCOUN_TRANSFER("계좌이체"),
	REMITTANCE("무통장입금"),
	ON_SITE_PAYMENT("현장결재"),
	TOSS("토스"),
	CARD("신용카드"),
	KAKAO_PAY("카카오페이"),
	PAYCO("페이코"),
	BAEMIN_PAY("배민페이"),
	POINT("포인트"),
	COUPON("쿠폰"),
	EMPTY("없음");

	private String title;
	PayType(final String title) { this.title = title; }
	public String getTitle() { return title; }
}
enum PayGroup {
	CASH("현금", Arrays.asList(PayType.ACCOUN_TRANSFER, PayType.REMITTANCE, PayType.ON_SITE_PAYMENT, PayType.TOSS)),
	CARD("카드", Arrays.asList(PayType.CARD, PayType.KAKAO_PAY, PayType.PAYCO, PayType.BAEMIN_PAY)),
	ETC("기타", Arrays.asList(PayType.POINT, PayType.COUPON)),
	EMPTY("없음", Collections.emptyList());

	private String title;
	private List<PayType> payList;
	PayGroup(final String title, final List<PayType> payList) {
		this.title = title;
		this.payList = payList;
	}

	public static PayGroup findByPayCode(final PayType code) {
		return Arrays.stream(PayGroup.values())
				.filter(payGroup -> payGroup.hasPayCode(code))
				.findAny()
				.orElse(EMPTY)
				;
	}
	public boolean hasPayCode(final PayType code) {
		return payList.stream()
				.anyMatch(payCode -> payCode == code);
	}
	public String getTitle() {
		return title;
	}
}

public class _Application {
	public static void main(final String [] args) {
		PayType payCode = PayType.BAEMIN_PAY;
		PayGroup payGroup = PayGroup.findByPayCode(payCode);
		System.out.println(payGroup.name());
		System.out.println(payGroup.getTitle());
	}
}

4. 관리 주체를 DB에서 객체로

Good Case

package com.donzbox._04_DBtoObject._1_GoodCase;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/*
 * DB의 코드 테이블을 별도로 두고 이를 조회하여 사용하다보니, 계속해서 문제가 발생했습니다.
 * 01. 코드명만 봐서는 무엇을 나타내는지 알 수가 없었습니다.
 *     처음 프로젝트에 투입되는데, 모든 메소드들이 01, 1 등등의 매직넘버를 if 조건의 기준으로 되어있다고 상상해보겠습니다.
 *     01이란 코드가 뭔지 알기 위해서 서버코드에서 실행되는 코드를 보고 Grp_cd를 찾아내고, DB에서 조회해야만 했습니다.
 *     문서화가 되어있다 하더라도, 문서 업데이트가 잘되어있는지 확신할 수 없기에 DB를 다시 찾아봐야했습니다.
 * 02. 항상 코드 테이블 조회 쿼리가 실행되어야만 했습니다.
 *     특별히 조회를 하지 않음에도 UI를 그리기 위해 항상 코드 테이블을 조회해야만 했습니다.
 *     물론 캐시등을 적절히 활용하는 방법이 있습니다.
 * 03. 카테고리 코드를 기반으로한 서비스 로직을 추가할 때 그 위치가 애매했습니다.
 *     1 ~ 3 사례들과 비슷한 경우인데, 해당 코드에 따라 수행되야 하는 기능이 있을 경우 메소드의 위치는 Service 혹은 유틸 클래스가 될 수 밖에 없었습니다.
 *
 * 특히나 카테고리의 경우 6개월에 1~2개가 추가될까말까한 영역인데 굳이 테이블로 관리하는 것은 장점보다 단점이 더 많다고 생각하였습니다.
 * 카테고리성 데이터를 Enum으로 전환하고, 팩토리와 인터페이스 타입을 선언하여 일관된 방식으로 관리되고 사용할 수 있도록 진행하게 되었습니다.
 */
interface EnumMapperType {
	String getCode();
	String getTitle();
}

class EnumMapperValue {
	private String code;
	private String title;
	public EnumMapperValue(final EnumMapperType enumMapperType) {
		this.code = enumMapperType.getCode();
		this.title = enumMapperType.getTitle();
	}
	public String getCode() { return code; }
	public String getTitle() { return title; }
}

enum FeeType implements EnumMapperType {
	PERCENT("정율"),
	PRICE("정액");
	private String title;
	FeeType(final String title) { this.title = title; }
	@Override
	public String getCode() { return name();}
	@Override
	public String getTitle() { return title; }
}

public class _Application {
	public static void main(final String [] args) {
		List<EnumMapperValue> list = Arrays.stream(FeeType.values())
				.map(EnumMapperValue::new)
				.collect(Collectors.toList());
		list.forEach(ev -> System.out.println(ev.getCode() + " / " + ev.getTitle()));
	}
}

Best Case

package com.donzbox._04_DBtoObject._2_BestCase;

import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

interface EnumMapperType {
	String getCode();
	String getTitle();
}

class EnumMapperValue {
	private String code;
	private String title;
	public EnumMapperValue(final EnumMapperType enumMapperType) {
		this.code = enumMapperType.getCode();
		this.title = enumMapperType.getTitle();
	}
	public String getCode() { return code; }
	public String getTitle() { return title; }
}

enum FeeType implements EnumMapperType {
	PERCENT("정율"),
	PRICE("정액");
	private String title;
	FeeType(final String title) { this.title = title; }
	@Override
	public String getCode() { return name();}
	@Override
	public String getTitle() { return title; }
}

// 런타임에 Enum의 상수들이 변경될 일이 없기에, 관리 대상인 Enum들은 미리 Bean에 등록하여 사용하도록 변경
class EnumMapper {
	private Map<String, List<EnumMapperValue>> factory = new LinkedHashMap<>();

	// EnumMapperType 인터페이스 구현체만 오도록 제한함
	public void put(final String key, final Class<? extends EnumMapperType> e) {
		factory.put(key, toEnumValues(e));
	}
	private List<EnumMapperValue> toEnumValues(final Class<? extends EnumMapperType> e) {
		return Arrays.stream(e.getEnumConstants())
				.map(EnumMapperValue::new)
				.collect(Collectors.toList());
	}
	public List<EnumMapperValue> get(final String key) { return factory.get(key); }
	public Map<String, List<EnumMapperValue>> get(final List<String> keys) {
		if(keys == null || keys.size() == 0) {
			return new LinkedHashMap<>();
		}
		return keys.stream()
				.collect(Collectors.toMap(Function.identity(), key -> factory.get(key)));
	}
	public Map<String, List<EnumMapperValue>> getAll() { return factory; }
}

/*
 * Enum을 사용하는데 있어 가장 큰 허들은 “변경이 어렵다“ 입니다.
 * 코드를 추가하거나 변경해야 하는 일이 빈번하다면, 매번 Enum 코드를 변경하고 배포하는것보다
 * 관리자 페이지에서 관리자가 직접 변경하는 것이 훨씬 편리할 수 있다고 생각합니다.
 * 하지만 우리가 관리하는 이 코드 테이블은 과연 얼마나 자주 변경되나요?
 *
 * 한번 생성된 코드들은 얼마나 많은 테이블에서 사용되시나요?
 * 사용되는 테이블이 많아 변경하게 되면 관련된 테이블 데이터를 전부다 변경해야 하진 않으신가요?
 * 한번 생성된 코드테이블의 코드들을 변경할 일이 자주 있으셨나요?
 * 추가되는 코드는 한달에 몇번이나 발생하시나요?
 * 1년에 몇번 발생하시나요? 매일 발생하시나요? 하루에 배포는 몇번을 하시나요?
 *
 * 만약 위와 같은 상황이라면 테이블로 관리함으로써 얻는 장점이
 * 정적언어를 활용함으로써 얻는 장점을 버릴정도로
 * 더 큰지 고민해봐야할 문제라고 생각합니다.
 */
public class _Application {
	// like define Bean
	public static EnumMapper enumMapper() {
		EnumMapper enumMapper = new EnumMapper();
		enumMapper.put("FeeType", FeeType.class);
		return enumMapper;
	}
	public static void main(final String [] args) {
		// like define Annotation
		EnumMapper enumMapper = enumMapper();
		List<EnumMapperValue> list = enumMapper.get("FeeType");
		list.forEach(ev -> System.out.println(ev.getCode() + " / " + ev.getTitle()));
	}
}

출처 : https://stackoverflow.com/questions/39331464/removing-visited-style-in-href-attribute


질문 : 이런 html 스타일을 적용하고 싶은데 어떻게 해야 하나요?

<a style="text-decoration:none;" >


답변 : 이하와 같이 하면 됩니다.

<html>

<head>

<style>

a:hover {

text-decoration: none;

}

</style>

</head>

<body>

   <a href="#">Link</a>

   </body>

</html>


<html>

<body>

<!-- Or you could use Javascript-->

<a href="#" onmouseover = "this.style.textDecoration = 'none'">Link 2</a>

</body>

</html>



이하의 방법 중 맞는 것 선택하여 적용해볼 것


01 .server.xml

<Connector port="8080" ... URIEncoding="UTF-8" />

<Connector port="8009" ... URIEncoding="UTF-8" />


02. web.xml

<filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


03. 소스파일 utf-8형식 으로 저장

프로젝트 상단에서 오른클릭 후 Properties -> Resource -> Text file encoding (UTF-8)


04. 소스코드

<%@pagepageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>

<% request.setCharacterEncoding("utf-8"); %>


05. 톰켓실행옵션

-Dfile.encoding=UTF-8

View창 중에 Servers -> 해당톰켓서버 -> 더블클릭 ->Open launch configuration -> Common탭 -> Encoding -> UTF-8






 AWS Linux에서 MySQL서버 UTF-8 한글 설정

[ec2-user@ip-172-31-20-116 ~]$ sudo vi /etc/my.cnf 


[mysql]

default-character-set=utf8


[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

# Settings user and group are ignored when systemd is used.

# If you need to run mysqld under a different user or group,

# customize your systemd unit file for mysqld according to the

# instructions in http://fedoraproject.org/wiki/Systemd


# 0 : 대소문자를 구분함(default)

# 1 : 대소문자를 구분안함(대문자로 쓴 쿼리도 소문자로 변경해서 날린다)

# 2 : 윈도우에서도 대소문자를 구분함

lower_case_table_names=1


character-set-client-handshake=FALSE

init_connect="SET collation_connection=utf8_general_ci"

init_connect="SET NAMES utf8"

character-set-server=utf8

collation-server=utf8_general_ci


[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

bind-address=0.0.0.0


[sourcecode language=”sql”]

show variables like ‘lower_case_table_names%’

[/sourcecode]


[client]

default-character-set=utf8


my.cnf 설정 후 재기동


[ec2-user@ip-172-31-20-116 ~]$ sudo service mysqld restart

Stopping mysqld:                                           [  OK  ]

Starting mysqld:                                           [  OK  ]

[ec2-user@ip-172-31-20-116 ~]$


원격접속 로그 지우기


RDP_Log_Cleaner_Win7_8.cmd


@echo off

title RDP Log Cleaner :: NEORAY

mode con cols=50 lines=5

color 0A


cls

REG DELETE "\\.\HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default" /va /f

REG DELETE "\\.\HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" /f


del "%userprofile%\Documents\Default.rdp" /Q /A:h

del "%userprofile%\Documents\Default.rdp" /Q


cls

echo  ------------------------------------------------

echo  ------------ RDP Log Clean Finished ------------

echo  ------------------------------------------------

echo Wil You Leave Message To neoray.tistory.com?

set /p YN=Continue(Y/N)?


if /i "%YN%" == "y" c:\progra~1\intern~1\iexplore.exe http://DonzBox.tistory.com

if /i "%YN%" == "n" exit

exit


1. vsftpd 설치

-

[ec2-user@ip-172-31-20-116 ~]$ sudo yum install vsftpd

Loaded plugins: priorities, update-motd, upgrade-helper

amzn-main                                                                           | 2.1 kB  00:00:00     

amzn-updates                                                                        | 2.5 kB  00:00:00     

Resolving Dependencies

--> Running transaction check

---> Package vsftpd.x86_64 0:2.2.2-13.13.amzn1 will be installed

--> Finished Dependency Resolution


Dependencies Resolved


===========================================================================================================

 Package              Arch                 Version                           Repository               Size

===========================================================================================================

Installing:

 vsftpd               x86_64               2.2.2-13.13.amzn1                 amzn-main               161 k


Transaction Summary

===========================================================================================================

Install  1 Package


Total download size: 161 k

Installed size: 320 k

Is this ok [y/d/N]: y

Downloading packages:

vsftpd-2.2.2-13.13.amzn1.x86_64.rpm                                                 | 161 kB  00:00:00     

Running transaction check

Running transaction test

Transaction test succeeded

Running transaction

  Installing : vsftpd-2.2.2-13.13.amzn1.x86_64                                                         1/1 

  Verifying  : vsftpd-2.2.2-13.13.amzn1.x86_64                                                         1/1 


Installed:

  vsftpd.x86_64 0:2.2.2-13.13.amzn1                                                                        


Complete!

[


2. VSFTP 환경설정


[ec2-user@ip-172-31-20-116 www]$ sudo vi /etc/vsftpd/vsftpd.conf 


# The name of log file when xferlog_enable=YES and xferlog_std_format=YES

# WARNING - changing this filename affects /etc/logrotate.d/vsftpd.log

#xferlog_file=/var/log/xferlog

#

# Switches between logging into vsftpd_log_file and xferlog_file files.

# NO writes to vsftpd_log_file, YES to xferlog_file

xferlog_std_format=YES

#

# You may change the default value for timing out an idle session.

#idle_session_timeout=600

#

# You may change the default value for timing out a data connection.

#data_connection_timeout=120

#

# It is recommended that you define on your system a unique user which the

# ftp server can use as a totally isolated and unprivileged user.

#nopriv_user=ftpsecure

#

# Enable this and the server will recognise asynchronous ABOR requests. Not

# recommended for security (the code is non-trivial). Not enabling it,

# however, may confuse older FTP clients.

#async_abor_enable=YES

#

# By default the server will pretend to allow ASCII mode but in fact ignore

# the request. Turn on the below options to have the server actually do ASCII

# mangling on files when in ASCII mode.

# Beware that on some FTP servers, ASCII support allows a denial of service

# attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd

# predicted this attack and has always been safe, reporting the size of the

# raw file.

# ASCII mangling is a horrible feature of the protocol.

#ascii_upload_enable=YES

#ascii_download_enable=YES

#

# You may fully customise the login banner string:

#ftpd_banner=Welcome to blah FTP service.

#

# You may specify a file of disallowed anonymous e-mail addresses. Apparently

# useful for combatting certain DoS attacks.

#deny_email_enable=YES

# (default follows)

#banned_email_file=/etc/vsftpd/banned_emails

#

# You may specify an explicit list of local users to chroot() to their home

# directory. If chroot_local_user is YES, then this list becomes a list of

# users to NOT chroot().

chroot_local_user=YES   <-- home디렉토리를 FTP 접속루트로 잡고 계정도 리눅스꺼 공유해서 쓰겠다

#chroot_list_enable=YES

# (default follows)

#chroot_list_file=/etc/vsftpd/chroot_list

#

# You may activate the "-R" option to the builtin ls. This is disabled by

# default to avoid remote users being able to cause excessive I/O on large

# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume

# the presence of the "-R" option, so there is a strong case for enabling it.

#ls_recurse_enable=YES

#

# When "listen" directive is enabled, vsftpd runs in standalone mode and

# listens on IPv4 sockets. This directive cannot be used in conjunction

# with the listen_ipv6 directive.

listen=YES

#

# This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6

# sockets, you must run two copies of vsftpd with two configuration files.

# Make sure, that one of the listen options is commented !!

#listen_ipv6=YES


pam_service_name=vsftpd

userlist_enable=YES   <-- user_list 파일 사용

tcp_wrappers=YES

pasv_enable=YES          <-- passive mode 사용

pasv_min_port=1024

pasv_max_port=1048

pasv_address=11.111.222.233   <-- Public IP (외부에서 치고 들어오는 IP)


3. 리눅스 사용자 계정 추가 및 홈 디렉토리 변경하여 FTP 접속 루트 디렉토리로 지정


[ec2-user@ip-172-31-20-116 donzbox]$ sudo adduser donzbox2

[ec2-user@ip-172-31-20-116 donzbox]$ sudo passwd donzbox2

choickey 사용자의 비밀 번호 변경 중

  암호:

  암호 재입력:

passwd: 모든 인증 토큰이 성공적으로 업데이트 되었습니다.


[ec2-user@ip-172-31-20-116 donzbox]$ sudo usermod -d /ftp_root donzbox2  <-- donzbox2님의 홈디렉토리 /home/donzbox2 를

                                                                                       /ftp_root 로 바꾸고 FTP 접속시 절루 가게함


[ec2-user@ip-172-31-20-116 donzbox]$ sudo chmod -R 755 /ftp_root  <-- 쓰기권한 부여하지 않으면 FTP 접속은 되지만 파일업로드가 안됨

[ec2-user@ip-172-31-20-116 donzbox]$



4. VSFTPD 서버 재기동하여 위의 사항 적용

[ec2-user@ip-172-31-20-116 donzbox]$ 

[ec2-user@ip-172-31-20-116 donzbox]$ sudo service vsftpd restart

Shutting down vsftpd:                                      [  OK  ]

Starting vsftpd for vsftpd:                                [  OK  ]
[ec2-user@ip-172-31-20-116 donzbox]$


5. 접속 테스트

조낸잘댐


6. 참고

이 목록에 없는 사용자만 FTP에 접근할 수 있게 하는 설정 (파일이름이 헷갈리네 @_@)


[ec2-user@ip-172-31-20-116 www]$

[ec2-user@ip-172-31-20-116 vsftpd]$ sudo vi /etc/vsftpd/user_list


# vsftpd userlist

# If userlist_deny=NO, only allow users in this file

# If userlist_deny=YES (default), never allow users in this file, and

# do not even prompt for a password.

# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers

# for users that are denied.

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

news

uucp

operator

games

nobody

~          


서버 재기동시 자동으로 vsftpd 가 시작되지 않게

sudo chkconfig --level 345 vsftpd on

vsftpd 제거 (환경설정 및 서비스도 날라감)

sudo yum remove vsftpd





1. build.gradle 설정

buildscript {

ext {

buildVersion = "0.0.1-SNAPSHOT"

springBootVersion = '1.5.8.RELEASE'

}

repositories {

mavenCentral()

}

dependencies {

classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")

}

}


apply plugin: 'java'

apply plugin: 'eclipse'

apply plugin: 'org.springframework.boot'

apply plugin: 'io.spring.dependency-management'


//create a single Jar with all dependencies

jar {

    baseName = "homepage-batch"

    version = "${buildVersion}"

    manifest {

        attributes 'Title': 'Reqeust And Header Tester',

                   'Version': 1.0,

                   'Main-Class': 'com.donzbox.HomepageBatchApplication'

    }

    from {

        configurations.compile.collect {

            it.isDirectory() ? it : zipTree(it)

        }

    }

}



group = 'com.donzbox'

version = '0.0.1-SNAPSHOT'

sourceCompatibility = 1.8


repositories {

mavenCentral()

}


configurations {

providedRuntime

}


dependencies {

runtime("org.springframework.boot:spring-boot-devtools:${springBootVersion}")

compile("org.springframework:springloaded:1.2.8.RELEASE")

testCompile('org.springframework.boot:spring-boot-starter-test')

compileOnly("org.projectlombok:lombok:1.18.6")

annotationProcessor("org.projectlombok:lombok:1.18.6")  <- gradle compile 시 lombok 으로 인한 간섭이 없도록 함

}

test {
    ignoreFailures = true
}


2-1. gradle 빌드 실행 (방법 1)

Working Directory: D:\My Data\WWW\App Source\Batch_Trading

Gradle user home: C:\Users\Donz\.gradle

Gradle Distribution: Gradle wrapper from target build

Gradle Version: 5.2.1

Java Home: C:\Program Files\Java\jdk1.8.0_181

JVM Arguments: None

Program Arguments: None

Build Scans Enabled: false

Offline Mode Enabled: false

Gradle Tasks: clean jar build


> Task :clean

> Task :compileJava

> Task :processResources

> Task :classes

> Task :jar

> Task :findMainClass

> Task :bootRepackage

> Task :assemble

> Task :compileTestJava

> Task :processTestResources NO-SOURCE

> Task :testClasses


> Task :test


com.donzbox.BatchTradingApplicationTests > contextLoads FAILED

    java.lang.IllegalStateException

        Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException

            Caused by: org.springframework.beans.factory.BeanCreationException

                Caused by: java.lang.IllegalArgumentException


1 test completed, 1 failed

There were failing tests. See the report at: file:///D:/My%20Data/WWW/App%20Source/Batch_Trading/build/reports/tests/test/index.html


> Task :check

> Task :build


BUILD SUCCESSFUL in 15s

8 actionable tasks: 8 executed 



2-2. gradle 빌드 실행 (방법 2)




3. clean , jar , build 를 실행

   1) clean  : /homepage-batch/build/libs 디렉토리 비움

   2) jar     : /homepage-batch/build/libs 디렉토리내에 homepage-batch-0.0.1-SNAPSHOT.jar 파일 생성

   3) build : 2)번에서 나온 jar는 실행이 되지 않으므로 build를 수행하여 다음과 같이 파일을 추가로 생성 시킴 (.original 파일이 나옴을 확인해야 함)

-rw-r--r--  1 donz  staff  34056813  4 28 01:27 homepage-batch-0.0.1-SNAPSHOT.jar
-rw-r--r--  1 donz  staff  16724283  4 28 01:26 homepage-batch-0.0.1-SNAPSHOT.jar.original
-rw-r--r--  1 donz  staff  17140592  4 28 01:27 homepage-batch-0.0.1-SNAPSHOT.war
-rw-r--r--  1 donz  staff  15397128  4 28 01:26 homepage-batch-0.0.1-SNAPSHOT.war.original



4. 실행방법


/homepage-batch/build/libs> java -jar homepage-batch-0.0.1-SNAPSHOT.jar --spring.profiles.active=localMac 


SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/Users/donz/Desktop/My_Data/project_e/workspace_bd/workspace_homepage/homepage/homepage-batch/build/libs/homepage-batch-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/Users/donz/Desktop/My_Data/project_e/workspace_bd/workspace_homepage/homepage/homepage-batch/build/libs/homepage-batch-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]


  .   ____          _            __ _ _

 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \

( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \

 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )

  '  |____| .__|_| |_|_| |_\__, | / / / /

 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                        


Original Data [0] => CRIX.UPBIT.KRW-BTC, 2018-04-28T01:29:00+09:00 10086000.000000 49054019.112400

Original Data [1] => CRIX.UPBIT.KRW-BTC, 2018-04-28T01:28:00+09:00 10093000.000000 135643767.039290

[C] 2018-04-28T01:29:00+09:00 == [B] Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

taskScheduler-1

^C%                                   

donz@Donzui-MBP /homepage-batch/build/libs> 실행잘됨




윈도우 이클립스로 개발하는 중

패키지 익스플로러에서 파일 이름바꾸기 후 위치 이동, 패키지 명 변경 등을 하고 난 뒤 svn에 커밋하려는데 애러발생!!!


1. 커맨드를 열고 문제가 있는 svn에서 지적 당한 경로로 이동 후 이하 실행

Microsoft Windows [Version 10.0.16299.309]

(c) 2017 Microsoft Corporation. All rights reserved.


X:\homepage>svn remove --force homepage-batch

D         homepage-batch

D         homepage-batch\.classpath

D         homepage-batch\.gradle

D         homepage-batch\.project

D         homepage-batch\.settings

D         homepage-batch\.settings\gradle

D         homepage-batch\.settings\gradle\org.springsource.ide.eclipse.gradle.core.prefs

D         homepage-batch\.settings\org.eclipse.buildship.core.prefs

D         homepage-batch\.settings\org.eclipse.wst.common.component

D         homepage-batch\.settings\org.eclipse.wst.common.project.facet.core.xml

D         homepage-batch\.springBeans

D         homepage-batch\bin

D         homepage-batch\bin\application.properties

D         homepage-batch\bin\com

D         homepage-batch\bin\env

D         homepage-batch\bin\log4jdbc.log4j2.properties

D         homepage-batch\bin\logback-spring.xml

D         homepage-batch\bin\mappers

D         homepage-batch\build

D         homepage-batch\build.gradle

D         homepage-batch\gradle

D         homepage-batch\gradle\wrapper

D         homepage-batch\gradle\wrapper\gradle-wrapper.jar

D         homepage-batch\gradle\wrapper\gradle-wrapper.properties

D         homepage-batch\gradlew

D         homepage-batch\gradlew.bat

D         homepage-batch\logs

D         homepage-batch\logs\201802

D         homepage-batch\logs\201802\service_2018-02-05.0.log

D         homepage-batch\src

D         homepage-batch\src\main

D         homepage-batch\src\main\java

D         homepage-batch\src\main\java\com

D         homepage-batch\src\main\java\com\donzbox

D         homepage-batch\src\main\java\com\donzbox\HomepageBatchApplication.java

D         homepage-batch\src\main\java\com\donzbox\config

D         homepage-batch\src\main\java\com\donzbox\config\DatabaseConfig.java

D         homepage-batch\src\main\java\com\donzbox\cron

D         homepage-batch\src\main\java\com\donzbox\cron\cryptoSignal

D         homepage-batch\src\main\java\com\donzbox\cron\cryptoSignal\CryptoSignalThread.java

D         homepage-batch\src\main\java\com\donzbox\domain

D         homepage-batch\src\main\java\com\donzbox\domain\cryptoSignal

D         homepage-batch\src\main\java\com\donzbox\domain\cryptoSignal\both

D         homepage-batch\src\main\java\com\donzbox\domain\cryptoSignal\both\CryptoSignalEntity.java

D         homepage-batch\src\main\java\com\donzbox\mapper

D         homepage-batch\src\main\java\com\donzbox\mapper\cryptoSignal

D         homepage-batch\src\main\java\com\donzbox\mapper\cryptoSignal\CryptoSignalMapper.java

D         homepage-batch\src\main\java\com\donzbox\service

D         homepage-batch\src\main\java\com\donzbox\service\cryptoSignal

D         homepage-batch\src\main\java\com\donzbox\service\cryptoSignal\CryptoSignalService.java

D         homepage-batch\src\main\java\com\donzbox\service\cryptoSignal\CryptoSignalServiceImpl.java

D         homepage-batch\src\main\resources

D         homepage-batch\src\main\resources\application.properties

D         homepage-batch\src\main\resources\env

D         homepage-batch\src\main\resources\env\localMac

D         homepage-batch\src\main\resources\env\localMac\config.properties

D         homepage-batch\src\main\resources\env\localMac\jdbc.properties

D         homepage-batch\src\main\resources\env\localMac\log.xml

D         homepage-batch\src\main\resources\env\localPC

D         homepage-batch\src\main\resources\env\localPC\config.properties

D         homepage-batch\src\main\resources\env\localPC\jdbc.properties

D         homepage-batch\src\main\resources\env\localPC\log.xml

D         homepage-batch\src\main\resources\log4jdbc.log4j2.properties

D         homepage-batch\src\main\resources\logback-spring.xml

D         homepage-batch\src\main\resources\mappers

D         homepage-batch\src\main\resources\mappers\cryptoSignal

D         homepage-batch\src\main\resources\mappers\cryptoSignal\CryptoSignalMapper.xml

D         homepage-batch\src\test


2. svn resolve 명령어 실행

X:\homepage>svn resolve --accept=working homepage-batch


X:\homepage>svn commit

svn: E205007: Commit failed (details follow):

svn: E205007: Could not use external editor to fetch log message; consider setting the $SVN_EDITOR environment variable or using the --message (-m) or --file (-F) options

svn: E205007: None of the environment variables SVN_EDITOR, VISUAL or EDITOR are set, and no 'editor-cmd' run-time configuration option was found


3. 노트패드를 이용하여 내역을 확인하여 명령어 실행

X:\homepage>svn --editor-cmd notepad.exe commit


Log message unchanged or not specified

(a)bort, (c)ontinue, (e)dit:

c

Sending        homepage-api\.classpath

Sending        homepage-api\.settings\org.eclipse.buildship.core.prefs

Sending        homepage-api\.settings\org.eclipse.wst.common.component

Sending        homepage-api\.settings\org.eclipse.wst.common.project.facet.core.xml

Deleting       homepage-api\bin\Library.class

Deleting       homepage-api\bin\LibraryTest.class

Sending        homepage-backoffice\.classpath

Sending        homepage-backoffice\.settings\org.eclipse.buildship.core.prefs

Sending        homepage-backoffice\.settings\org.eclipse.wst.common.component

Sending        homepage-backoffice\.settings\org.eclipse.wst.common.project.facet.core.xml

Deleting       homepage-backoffice\bin\Library.class

Deleting       homepage-backoffice\bin\LibraryTest.class

Sending        homepage-common\.classpath

Sending        homepage-common\.settings\org.eclipse.buildship.core.prefs

Sending        homepage-common\.settings\org.eclipse.wst.common.component

Sending        homepage-common\.settings\org.eclipse.wst.common.project.facet.core.xml

Deleting       homepage-common\bin\Library.class

Deleting       homepage-common\bin\LibraryTest.class

Deleting       homepage-common\bin\Test.class

Sending        homepage-front\.classpath

Sending        homepage-front\.settings\org.eclipse.buildship.core.prefs

Sending        homepage-front\.settings\org.eclipse.wst.common.component

Sending        homepage-front\.settings\org.eclipse.wst.common.project.facet.core.xml

Deleting       homepage-front\bin\.DS_Store

Deleting       homepage-front\bin\application.properties

Deleting       homepage-front\bin\cert

Deleting       homepage-front\bin\env

Deleting       homepage-front\bin\log4jdbc.log4j2.properties

Deleting       homepage-front\bin\logback-spring.xml

Deleting       homepage-front\bin\mappers

Deleting       homepage-front\bin\spring.properties

Deleting       homepage-front\bin\validation.properties

Sending        homepage-helper\.classpath

Sending        homepage-helper\.project

Sending        homepage-helper\.settings\org.eclipse.buildship.core.prefs

Sending        homepage-helper\.settings\org.eclipse.wst.common.component

Sending        homepage-helper\.settings\org.eclipse.wst.common.project.facet.core.xml

Deleting       homepage-helper\bin\.DS_Store

Deleting       homepage-helper\bin\application.properties

Deleting       homepage-helper\bin\cert

Deleting       homepage-helper\bin\com

Deleting       homepage-helper\bin\env

Deleting       homepage-helper\bin\log4jdbc.log4j2.properties

Deleting       homepage-helper\bin\logback-spring.xml

Deleting       homepage-helper\bin\mappers

Deleting       homepage-helper\bin\spring.properties

Deleting       homepage-helper\bin\validation.properties

Sending        logs\service.log

Transmitting file data ......................done

Committing transaction...

Committed revision 585.


4. 변경 내역을 저장

X:\homepage>svn commit

X:\homepage>






내가 하도 답답해서...


박스 서버에 새로산 SSD에 윈도우10-RS3로 새로 깔고 마이스큐엘도 최신5.7으로 받아 깔고

맥북에서 윈도10 마이스큐엘에 접속하여 개발 하려고 하는데 

맥북에 설치된 DB Visualizer 에서 부터 접속 부터 안되서 이것 저것 하다가 그냥 정리겸 포스팅 함

일전에 한번 해봤는데 까먹어서 다시 삽질하며 밤이 깊어지다.


윈도우10에 MySQL5.7(2018년3월 현재 최신버전)을 깔고 깔면 기본적으로 제공해 주는 워크벤치에서 이하와 같이 마이스큐엘에서 접속권한 설정하고

(파랭이:기본적으로 셋팅되어 있음 / 빨갱이:내가 추가함)


이하와 같이 추가한 접속가능 롤에 모든 권한도 주고


이하와 같이 쿼리를 날려 설정된걸 확인하고

SELECT HOST, USER, AUTHENTICATION_STRING FROM MYSQL.USER WHERE USER='your_user_name'; 



DB Visualizer 로 접속했더니 접속이 안된다.

참고로

마이스큐엘이 있는 박스서버는 DonzBox.com 도메인이 연결되어 있고, 고로 IP공유기에 DMZ 설정되어 있으며,

DB Visualizer로 접속하는 맥북은 같은 IP공유기의  WIFi를 사용 중임.


애러 현상

접속을 누르면 이하와 같은 애러

An error occurred while establishing the connection:

Long Message:

Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

Details:

   Type: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException

   SQL State: 08S01 


원인 및 해결방법

MySQL5.7 은 윈도우 시스템에 인스톨 될때 방화벽 설정이 (도메인, 개인) 두개만 체크가 된다. 이하와 같이 (공용)도 체크해 준다.

방화벽은 서버를 재기동 할 필요 없음. 다시 접속해 보면 접속이 잘됨.


이렇게 하면 DB 툴에서 서버의 MySQL로 접속은 성공이다.



애러현상

다음 문제는 개발 환경에서 맥북의 로컬 스프링부트 환경의 프레임웍 기동시 DB 애러 발생 

Caused by: com.mysql.cj.core.exceptions.InvalidConnectionAttributeException: The server time zone value '´ëÇѹα¹ Ç¥ÁؽÃ' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

글자까지 깨져 나와서 무슨 말인지 모르겠지만, 타임존이 어쩌구 저쩌구 하는듯 하여 찾아보았다.


원인 및 해결방법

마이스큐엘 5.7은 별도의 타임존 설정을 수동으로 해줘야 하며, 그래서 DB의 타임존과 서버시간이 차이가 나면 위와 같은 애러를 뱉는 모양임.

어쨌든 저 문제를 해결하려면

리눅스용 마이스큐엘 구글링은 방법이 많이 나와있는데 윈도는 문서 찾기가 힘듬. 스테거블로우에서 조각조각 정보를 모아서 시도함

1. 이하의 링크로 드가서 자기거를 다운 받아둔다. (나는 https://downloads.mysql.com/general/timezone_2018c_posix_sql.zip 이거 받음)

     https://dev.mysql.com/downloads/timezones.html

2.  받은거 압축풀면 sql 파일인데 알맹이 내용 전부 복사해서 DB툴로 자신의 DB에 연결한 후 붙여넣기 하고

     mysql 스키마에 47,462줄 정도 되는 INSERT문을 실행한다.

3. 이하의 쿼리로 잘 드갔는지 확인

select b.name, a.time_zone_id  from mysql.time_zone a, mysql.time_zone_name b where a.time_zone_id = b.time_zone_id and b.name like '%Seoul';

4. 서버에 마이스큐엘을 디폴트 디렉토리에 깔았다면 이하의 파일 마지막에 추가해준다.

    C:\ProgramData\MySQL\MySQL Server 5.7\my.ini

default-time-zone=Asia/Seoul

5. 마이스퀠 서버 재기동 후 이하의 쿼리 실행


SELECT @@global.time_zone, @@session.time_zone;

결과가 상기와 같이 나오면 스프링부트 개발에서도 마이스퀠에 붙는 거임



3월 03, 2018 3:21:33 오전 org.apache.tomcat.util.digester.SetPropertiesRule begin

경고: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.j2ee.server:homepage-helper' did not find a matching property.

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Server version:        Apache Tomcat/9.0.0.M26

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Server built:          Aug 2 2017 20:29:05 UTC

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Server number:         9.0.0.0

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: OS Name:               Mac OS X

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: OS Version:            10.13.3

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Architecture:          x86_64

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Java Home:             /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: JVM Version:           1.8.0_131-b11

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: JVM Vendor:            Oracle Corporation

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: CATALINA_BASE:         /Users/donz/Desktop/My_Data/project_e/workspace_bd/workspace_homepage/.metadata/.plugins/org.eclipse.wst.server.core/tmp0

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: CATALINA_HOME:         /Users/donz/Desktop/My_Data/project_e/tomcat/apache-tomcat-9.0.0.M26

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Command line argument: -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:49824

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Command line argument: -Dcatalina.base=/Users/donz/Desktop/My_Data/project_e/workspace_bd/workspace_homepage/.metadata/.plugins/org.eclipse.wst.server.core/tmp0

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Command line argument: -Dcatalina.home=/Users/donz/Desktop/My_Data/project_e/tomcat/apache-tomcat-9.0.0.M26

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Command line argument: -Dwtp.deploy=/Users/donz/Desktop/My_Data/project_e/workspace_bd/workspace_homepage/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Command line argument: -Djava.endorsed.dirs=/Users/donz/Desktop/My_Data/project_e/tomcat/apache-tomcat-9.0.0.M26/endorsed

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Command line argument: -Dspring.profiles.active=localMac

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Command line argument: -Djavaagent=/Users/donz/.gradle/caches/modules-2/files-2.1/org.springframework/springloaded/1.2.8.RELEASE/496703c6ed678701ed0447ef6113f9ec5eb6a7e2/springloaded-1.2.8.RELEASE-sources.jar

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Command line argument: -Xverify:none

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Command line argument: -Dfile.encoding=UTF-8

3월 03, 2018 3:21:33 오전 org.apache.catalina.core.AprLifecycleListener lifecycleEvent

정보: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/Users/donz/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.]

3월 03, 2018 3:21:33 오전 org.apache.coyote.AbstractProtocol init

정보: Initializing ProtocolHandler ["http-nio-8080"]

3월 03, 2018 3:21:33 오전 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector

정보: Using a shared selector for servlet write/read

3월 03, 2018 3:21:33 오전 org.apache.coyote.AbstractProtocol init

정보: Initializing ProtocolHandler ["https-jsse-nio-8444"]

3월 03, 2018 3:21:33 오전 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector

정보: Using a shared selector for servlet write/read

3월 03, 2018 3:21:33 오전 org.apache.coyote.AbstractProtocol init

정보: Initializing ProtocolHandler ["ajp-nio-8009"]

3월 03, 2018 3:21:33 오전 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector

정보: Using a shared selector for servlet write/read

3월 03, 2018 3:21:33 오전 org.apache.catalina.startup.Catalina load

정보: Initialization processed in 718 ms

3월 03, 2018 3:21:33 오전 org.apache.catalina.core.StandardService startInternal

정보: Starting service [Catalina]

3월 03, 2018 3:21:33 오전 org.apache.catalina.core.StandardEngine startInternal

정보: Starting Servlet Engine: Apache Tomcat/9.0.0.M26

3월 03, 2018 3:21:39 오전 org.apache.jasper.servlet.TldScanner scanJars

정보: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.

3월 03, 2018 3:21:39 오전 org.apache.catalina.core.ApplicationContext log

정보: 2 Spring WebApplicationInitializers detected on classpath

03:21:39.438 [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment - Adding PropertySource 'servletConfigInitParams' with lowest search precedence

03:21:39.454 [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment - Replacing PropertySource 'servletContextInitParams' with 'servletContextInitParams'

                                                                              .,:;;;;;:,.`                                                                             

                                                                   `;;;:::,,,,::::::::::::,:::::;;;.                                                                   

                                                         `';:,:,,,,,,,,,,,,,,,,:::::::::::::::::::::::::::;;',                                                         

                                                      ';:,,,,,,,,,,,,:;;;;;;:.```````````.:;;;;;;:::::::::::::;''                                                      

                                                ;;:,,,,,,,,:;;;``.`````````````````````..............,,.:;;:::::::::;'+                                                

                                              ':,,,,,,,,;;;`..````````````````````````````...............,,.;;;::::::::'+.                                             

                                         `;::,,,,,:;;`.```````````````````````````````````````..................:,;;:::::::'+:                                         

                                        '::,,,,,:;;`.`````````````````````````````````````````..................,,,,,;:::::::++`                                       

                                     ;:,,,,,:;;..``````````````````````````````````````````````..................,,,,,,:,;::::::'#,                                    

                                   :;,,,,,,;;`.````````````````````````````````````````````````...................,,,,,,,:;:::::::@@                                   

                                 '::,,,,;;..`````````````````````````````````````````````````........````   ``....,,,,,,,,,,:;::::::+@                                 

                                '::,,,,;;.````````````````````````````````:################..........``         `..,,,,,,,,,:;:;:::::'@                                

                               '::,,,,;;.```````````````````````######################################'            ..,,,,,,,::;,;:::::+@                               

                              '::,,,,;;.``````````````.@@@@@@@##########;`````````########################@@@@@@@   `.,,,,,,:::;,;:::::#@                              

                             :;:,,::;;.````````+@@@@@@@@@@@@##,``````````````````.##########################@@@@@@@@@@@@@:,,::::;:::::::@@                             

                             ;:::::;;...````@@@@@@@:    `````````````````````.....###########################@@@@@    `@@@@@:::::;;:;::;:#,                            

                            '::::::;.,..````@;@@@@@@@@@@``````````````````........#######################+       .@@@@@@@@@@:::::::;:;;;;+#                            

                            ;:::::;;,...````@#     @@@@@#######````````............##############........#######@@:    `@@@@::::::'::;;;;;#;                           

                           '::::::;.,...````@@           `##############...........+++;........,###########.`          `@@@':::::::;;:;;;;+#                           

                           ;:::::;;,.....```@@           `````````##########++++++;::+++++++#######..........`         .@@@::::::::'::;;;;;#`                          

                          .;:::::;,,.....`` @@     @     ```````.............:+++++++++++++....................`      `,@@@:::::::::;;:;;;;#+                          

                          ;;:::::;.,.....`` @@     @@@:  `````.....................++++............................`..,#@@@:::::::::;;:;;;;##                          

                          '::::::;,......`` @@     '@#######,......................++++......................,,,,,,,,,,@@@@:::::::::';:;;;;+#                          

                          '::::::;,.......` @@       ##################............++++.....................,,,,,,,,,,,@@@@:::::::::';:;;;;'#                          

                          ';:::::;,.......` @@          ###############............+++:....................,,,,,,,,,,,,@@@@:::::::::';:;;;;'#                          

                          ';:::::;,.......` @@         ``..........................+++....................,,,,,,,,,,,,:@@@#:::::::::';:;;;;'#                          

                          ';:::::;,,.......`#@         `...........................+++...................,,,,,,,,,,,,::@@@::::::::::';:;;;;++                          

                          ,':::::;,:........,@`       ``...........................+++.................,,,,,,,,,,,,,:::@@@::::::::::';:;;;;++                          

                           '::::::::.........@@     ```............................+++................,,,,,,,,,,,,::::;@@@:::::::::';;;;;;;+,                          

                           +':::::;,,........@@.`````..............................+++..............,,,,,,,,,,,,,::::@@@@@:::::::::';:;;;;'+                           

                           ,'::::::,:,........@@@@@@...............................###............,,,,,,,,,,,,,;@@@@@@@@@@::::::::;;;;;;;;++                           

                            +':::::;,,,,,........@@@@@@@@,.........................###.........,,,,,,,,,,,#####@@@@@@:::::::::::::';:;;;;'+                            

                            .'::::::;:,,,,,,..........@@@@#####....................###.......,,,,,,,+#########@#:::::::::::::::::+;;;;;;;++                            

                             ++::::::::,,,,,,,,............@#########;.............###...,,,,,,###########::::::::::::::::::::::'';:;;;;'+                             

                              +'::::::,;,,,,,,,,,,,,............:###########.......###,,,###########+,,,::::::::::::::::::::::::';:;;;;'+`                             

                               +;::::::,;,,,,,,,,,,,,,,,,,,,,,,.......'########################,,,,,,,:::::::::::::::::::::::::';:;;;;'+,                              

                               `#;:::::::;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,'############,,,,,,,,,,::::::::::::::::::::::::::;';:';'''+;                               

                                `#;:::::::;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;',,,,,,,,,,,:::::::::::::::::::::::::::::+';:'''''+;                                

                                   ##::::::::;:::::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::+';:'''''''`                                  

                                    #@:::::::;:;::::::::::::::,,,,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::+;;;'''''''                                    

                                       +@;:::::::;;':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;+;;:''''''''                                       

                                         @@;:::::::;:':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::+';;;''''''''                                         

                                             @#';;;;;;;::;;':::::::::::::::::::::::::::::::::::::::::::::::+'';:;'''''''''                                             

                                               '##;;;;;;;;::;;;':::::::::::::::::::::::::::::::::::::::++';;:;''''''';''                                               

                                                     ###;;;;;;;;;;;:::;;;;'''+++'';;;;'++++''';;;;::;'''''''''''''`                                                    

                                                        ;##+;;;;;;;;;;;;;;;:::::::::::::::::;;''''''''''''';'''                                                        

                                                                 ,#++++';;;;;;;;;;;;;;;'''''''''''''':                                                                 

                                                                         ,'++++++++++++++++'':`                                                                        

  

                    :@@@@@@@@@@@;::    ::@@@@@@@@@@@@@::::@@@@::     :@@@:::@@@@@@@@@@@@@@@@::@@@@@@@@@@@@@@:: :::@@@@@@@@@@@@::::@@@:::    ::@@@@:                    

                    :@@@@@@@@@@@@@::::::@@@@@@@@@@@@@@@+::@@@@@::    :@@@:::@@@@@@@@@@@@@@@@::@@@@@@@@@@@@@@@::+@@@@@@@@@@@@@@@:::@@@:::    ::@@@@:                    

                    :@@@@:::::::@@@@::::@@@::::::::'@@@+::@@@@@@@::  :@@@::::::::::::@@@@@@:::@@@:::::::::@@@::+@@@@::::::::@@@:::@@@@:::..::@@@@@:                    

                    :@@@@::     ::@@@:::@@@:``    :'@@@+::@@@@;@@@::::@@@:::    ::@@@@@@::: ::@@@+++++++++@@@::+@@@@:      :@@@:::::@@@@@++@@@@@:::                    

                    :@@@@::     ::@@@:::@@@:``    :'@@@+::@@@@:@@@@:::@@@:::   ::@@@@@@::   ::@@@@@@@@@@@@@@:::+@@@@:      :@@@::::::@@@@@@@@@::::                     

                    :@@@@::     ::@@@:::@@@:``    :'@@@+::@@@@:::@@@@@@@@::: ::@@@@@@::     ::@@@#########@@@::+@@@@:      :@@@:::::@@@@@##@@@@@::,                    

                    :@@@@:::::::::@@@:::@@@::::::::'@@@+::@@@@: ::@@@@@@@::::@@@@@::::::::::::@@@:::::::::@@@::+@@@@::::::::@@@:::@@@@:::,,::@@@@@:                    

                    :@@@@:::::::::@@@:::@@@::::::::'@@@+::@@@@:  ::@@@@@@:::@@@@@:::::::::::::@@@:::::::::@@@::+@@@@::::::::@@@:::@@@:::,  ,::@@@@:                    

                    :@@@@@@@@@@@@@@@;:::@@@@@@@@@@@@@@@:::@@@@:   `::;@@@:::@@@@@@@@@@@@@@@@::@@@@@@@@@@@@@@@:::@@@@@@@@@@@@@@@:::@@@:::    ::@@@@:                    

                    :@@@@@@@@@@@@@@;:::::@@@@@@@@@@@@@::::@@@@:    :::@@@:::@@@@@@@@@@@@@@@@::@@@@@@@@@@@@@@:: :::@@@@@@@@@@@@::::@@@:::    ::@@@@:                    

                                                                                                                                                              

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

[2018-03-03 03:21:47.181|http-nio-8080-exec-1|DEBUG|jdbc.sqlonly:223] sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-2)

5. /* com.donzbox.mapper.UserList : STAFF 스탭정보 (로그인세션정보용) */

                 SELECT 


[2018-03-03 03:21:47.221|http-nio-8080-exec-1|INFO |jdbc.resultsettable:610]

|---------|

|staff_id |

|---------|

|---------| 


그럼 행운들 빌어~

+ Recent posts