본문 바로가기
레거시

2022.03.03 의 기록

by GroovyArea 2022. 3. 3.

 하루 

=>  공부 관련

1) 스프링 개구리책 CH4

2) MVC 객체지향 리팩토링 (열거형, 인터페이스 고민)

3) 금일 수업 복습

 

=> 파이널 프로젝트 관련

1) DB 마무리 회의

2) 추후 디테일 업무 정리

3) 다음 회의할 것 git 협업

 


 문제 정리

1. 


 개인 공부

public class ViewInput {
	
	private static final String RSP_INPUT = "1, 2, 3 중에서 숫자를 입력하세요.";
	
	private static final String RESTART_INPUT = "재시작 하시겠습니까? (y:n)";
	
	private static final Scanner SCANNER = new Scanner(System.in);
	
	public ViewInput() {
	
	}
	
	// 가위바위보 숫자 입력 메서드
	public static int inputRsp() {
		System.out.println(RSP_INPUT);
		
		int input = SCANNER.nextInt();
		
		SCANNER.nextLine();
		
		return input;
	}
	
	// 재시작 문자 입력 메서드
	public char inputRestart() {
		System.out.println(RESTART_INPUT);
		
		char input = SCANNER.nextLine().charAt(0);
		
		SCANNER.nextLine();
		
		return input;
	}

=> viewInput 분리, 문자열은 상수화

public enum Rsp {
	ROCK,
	SCISSORS,
	PAPER;
	
	private Rsp() {
		// TODO Auto-generated constructor stub
	}
	
	
}

=> 이 상수들을 다른 객체에서 어떻게 이용할 것인지 고민 좀 해보자

 

String[] nameArr = {"Kim","Park","Jang","Lee"};
		List<String> nameList = Arrays.asList(nameArr);
		
		/*
		 * Arrays.sort(nameArr); Collections.sort(nameList);
		 * 
		 * for(String str : nameArr) { System.out.println(str); }
		 * 
		 * for(String str : nameList) { System.out.println(str); }
		 */	
		
		Stream<String> nameStream = nameList.stream();
		Stream<String> arrayStream = Arrays.stream(nameArr);
		
		nameStream
		.sorted()
		.forEach(System.out::println);
		arrayStream
		.sorted()
		.forEach(System.out::println);
		
		System.out.println(count());
		
		MyLambdaFunction lambdaFunction = (a,b) -> a>b? a:b;
		
		System.out.println(lambdaFunction.max(3, 5));
		
		Function<String, Integer> function = String::length;
		System.out.println(function.apply("Jewwloo"));
		
		Predicate<String> predicate = (str) -> str.equals("Hello World");
		System.out.println(predicate.test("Hello World"));
		
		Consumer<String> consumer = System.out::println;
		consumer.accept("hello!");
		
		
		List<String> list = Arrays.asList("a","b","c");
		
		Stream<String> stream = list.stream()
				.filter(name -> name.contains("a"));
				
		Stream<String> stream1 =
				list.stream()
				.map(s->s.toUpperCase());
	}
	
	public static long count() {
		List<String> myList = Arrays.asList("a1","a2","b1","b2","c2","c1");
		
		 return myList
		.stream()
		.filter(s->s.startsWith("c"))
		.map(String::toUpperCase)
		.sorted()
		.count();
	}
	
	
	
}
@FunctionalInterface
interface MyLambdaFunction{
	int max(int a, int b);
}

=> 람다와 Stream & Functional Interface 사용 연습 최초 생성 -> 중간 연산 -> 최종 연산 & 메서드 참조


▶ 수업 내용

Mybatis

동적 SQL (Dynamic SQL)

  • 엘리먼트의 전달값에 따라 다른 SQL 명령을 등록되는 기능
  • ⇒ OGNL(Object Graph Navigation Language) 표현식을 사용하여 구현⇒ 속성값으로 DTO & HashMap 클래스(Map 인터페이스) 설정
    • 엘리먼트 내용(SQL 문장)의 포함 여부를 설정하는 엘리먼트
    • test 속성 : [false] (SQL 문장 미포함) 또는 [true] (SQL 문장 포n함) 중 하나를 속성값으로 설정
    • ⇒ test 속성값이 [true]인 경우 SQL 문장을 SQL 명령에 포함
    • ⇒ 필드명 또는 맵키로 표현된 전달값을 비교한 조건식을 test 속성값으로 사용
    문제 : 필요하지 않은 값이 전달될 경우CHOOSE
    • 조건식에 의해 하나의 엘리먼트 내용(SQL문장)이 포함되도록 하는 설정하는 상위 엘리먼트
    • ⇒ 다수의 엘리먼트 중 하나의 엘리먼트 내용만 포함
    • ⇒ 하위 엘리먼트
      • when : 엘리먼트 내용(SQL 문장)의 포함 여부를 설정하는 엘리먼트
      • test 속성 : false(SQL 문장 미포함) 또는 true(SQL 문장 포함) 중 하나를 속성값으로 설정
      ⇒ test 속성값이 [true]인 경우 SQL 문장을 SQL 명령에 포함
      • otherwise : 모든 when 엘리먼트의 test 속성값이 [false] 인경우 엘리먼트 내용을 SQL 명령에 포함하는 엘리먼트
    해결법-2 )하나의 WHERE 구문으로 2개의 조건이 연결되어 포함되도록 설정
    • SQL 문장을 추가하거나 제거하는 기능을 제공하는 엘리먼트
    • ⇒ 하위 엘리먼트로 if 엘리먼트 사용
      • prefix 속성 : trim 엘리먼트에 SQL 문장이 존재할 경우 SQL 문장 앞부분에 추가될 단어를 속성값으로 설정
      • suffix 속성 : trim 엘리먼트에 SQL 문장이 존재할 경우 SQL 문장 뒷부분에 추가될 단어를 속성값으로 설정
      • prefixOverrides 속성 : trim 엘리먼트에 SQL 문장이 존재할 경우 SQL 문장 앞부분에서 삭제 될 단어를 속성값으로 설정
      • ⇒ | 연산자를 이용하여 제거할 단어를 나열하여 설정 가능
      • suffixOverrides 속성 : trim 엘리먼트에 SQL 문장이 존재할 경우 SQL 문장 뒷부분에서 삭제 될 단어를 속성값으로 설정
    ⇒ 다중 검색을 쉽게 구현 가능할 수 있다~ SQL을 계속 안 만들어줘도 됨
    • WHERE 엘리먼트에 SQL 구문이 존재할 경우 앞부분에 [WHERE] 단어를 추가하는 엘리먼트
    • ⇒ 하위 엘리먼트로 if 엘리먼트 사용
    • ⇒ where 엘리먼트의 문장 앞부분에 조건식이 아닌 문장이 존재할 경우 제거
    set 엘리먼트
    • set 엘리먼트에 SQL 문장에 존재할 경우 앞부분에 [SET] 단어를 추가하는 엘리먼트
    • ⇒ if 엘리먼트를 하위 엘리먼트로 사용
    • ⇒ 포함될 SQL 문장 뒷부분에 변경식이 아닌 문장이 존재할 경우 제거
  • where
  • trim
  • 해결법-1 ) 하나의 WHERE 구문만 포함되도록 설정
  • if 엘리먼트
  • 주의) 동적 SQL 기능을 사용할 경우 parameterType 속성값으로 기본형(Wrapper Class) 또는 String 클래스 사용 불가능

parameterType 속성값이 ArrayList 클래스(List 인터페이스)로 설정된 경우 SQL 명령에서는 전달값을 [list]로 표현

foreach

  • List 인스턴스를 전달받아 SQL 문장을 반복적으로 SQL 명령에 포함하는 엘리먼트
  • collection 속성 : 반복 처리할 List 인스턴스의 이름을 속성값으로 설정
  • item 속성 : List 인스턴스의 요소값을 제공받아 사용하기 위한 이름을 속성값으로 설정
  • open 속성 : foreach 엘리먼트 내용의 앞부분에 추가될 단어를 속성값으로 설정
  • close 속성 : foreach 엘리먼트 내용의 뒷부분에 추가될 단어를 속성값으로 설정
  • seperator 속성 : 요소값을 구분하는 구분단어를 속성값으로 설정

@Results

  • 검색행의 컬럼값을 클래스의 필드에 매핑되어 저장할 수 없는 정보를 제공하는 어노테이션
  • ⇒ XML 맵퍼의 resultMap 엘리먼트와 유사한 기능 제공
  • value 속성 : 매핑 정보를 Result 어노테이션 배열로 표현하여 속성값으로 설정
    • 검색행의 컬럼값을 필드에 매핑하기 위한 정보를 제공하는 엘리먼트
    • column 속성 : 검색행의 컬럼명을 속성값으로 설정
    • property 속성 : 컬럼값을 저장할 클래스의 필드명을 속성값으로 설정
  • @Result

@SelectProvider

  • SELECT 명령을 반환하는 클래스의 메서드를 호출하여 SELECT 명령을 등록하는 어노테이션 - 동적 SQL 기능을 제공하기 위한 클래스 작성
  • type 속성 : SQL 명령을 반환하는 메서드가 작성된 클래스(Clazz)를 속성값으로 설정
  • method 속성 : SQL 명령을 반환하는 메서드명을 속성값으로 설정

SQL

  • SQL 명령을 저장하기 위한 클래스
  • ⇒ SQL 명령 작성에 필요한 메서드를 호출하여 SQL 명령 저장
  • ⇒ 익명의 내부 클래스로 인스턴스를 생성하여 메서드 호출
  • SQL.toString() : SQL 인스턴스에 저장된 SQL 명령을 문자열로 변환하여 반환하는 메서드

폭포수 개발 모델

  • 순차적인 개발 방법

 

Spring Framework

Framework란?

  • 개발에 있어 기본이 되는 뼈대나 구조를 제공함
  • 여러 앱이 비슷한 구조를 가지므로 생산성이 향상되고 유지보수도 쉬움
  • 개방 폐쇄 원칙을 따름

⇒ java : 인터페이스, 클래스 ⇒ resources : XML 파일들
⇒ 웹 관련 자원들 : html, css, images..등등

Maven

  • 빌드 툴 - 프로젝트의 라이브러리를 관리하는 툴
    • Maven 빌드 툴을 이용하여 프로젝트에 라이브러리를 빌드하기 위한 정보를 제공하는 환경설정파일
    • ⇒ Local repository에 라이브러리 파일이 없는 경우 메이븐 저장소(Maven respository)에서 다운로드 받아 저장
    • 로컬 저장소(Local respository) : 프로젝트에 빌드될 라이브러리를 저장하여 제공하는 폴더
    • ⇒ 사용자 폴더의 .m2 폴더 사용 → 요게 로컬 저장소 이클립스 삭제하려면 .p2 .eclipse 폴더 다 삭제해야함
    • ⇒ 라이브러리 빌드에 문제가 있는 경우 이클립스 종료 후 .m2 폴더의 라이브러리 파일 삭제
    • 메이븐 저장소(Maven Repository) : https://mvnrepository.com
    • properties : pom.xml 파일에서 자주 사용되는 값을 등록하기 위한 엘리먼트
    • ⇒ 라이브러리 버전을 효율적으로 관리
    • ⇒ 하위 엘리먼트 이름을 ${엘리먼트명} 형식으로 표현하여 엘리먼트의 내용을 값으로 제공
    • dependency : 빌드 처리하기 위한 라이브러리의 정보를 설정하는 엘리먼트
      • groupid : 라이브러리 그룹을 설정하기 위한 엘리먼트 (패키지 같은 놈 → 어떤 회사에서 만들었는지 알 수 있음 라이브러리 이름이 같을 수 있기 때문에 그룹을 나눔)
      • artifactId : 라이브러리 이름을 설정하기 위한 엘리먼트
      • version : 라이브러리 버전을 설정하기 위한 엘리먼트
      • exclusions : exclusion 엘리먼트를 등록하기 위한 상위 엘리먼트
        • exclusion : 의존 관계의 라이브러리 제외 라이브러리를 설정하는 엘리먼트
        • 메이븐 버전 바꾸면 지가 알아서 라이브러리 빌드함
    • ⇒ 의존 관계의 라이브러리 자동 빌드 처리
    • scope : 라이브러리 적용 범위
    https://mvnrepository.com/artifact/xerces/xercesImpl
  • ⇒ 로그 구현체를 이용한 로깅 처리시 경로에 문제가 있는 경우 해결하기 위한 라이브러리

버전 변경 후 저장 시 스스로 라이브러리를 빌드하는 모습

Spring Framework 프로젝트 생성 시 변경 사항 및 이슈 사항

  1. 컨텍스트 네임 바꾸기 (서버 더블클릭)
  2. 프로그램 경로에 한글이 적혀있으면 log4j가 못 읽는다.
  3. 메이븐이 빌드 안 되었을 시 추가하면 됨(극히 드뭄)
  4. project facets 에서 java , webmodule 버전 16 , 4.0 버전으로 바꿔라
  5. spring 3 버전(MVC밖에 못함, 4는 클라우드)이니 jsp-api (4버전으로) 버전이니 다 올려줘야 함

Logging

  • 기록하는 행위
  • log4j.xml 에 기록에 대한 지침이 다 기록되어 있음
  • 위 엘리먼트에 들어갈 dtd 파일도 가지고 와야함⇒ log4j.xml 파일에 기록 관련 정보 설정
    • appender : 로그 전달 방식(로그매체)과 로그 형식을 설정하는 엘리먼트(어디에 어떻게 기록할지)
      • name 속성 : appender 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정
      • class 속성 : Appender 인터페이스를 상속받은 로그 구현체 클래스를 속성값으로 설정
        • fileAppender, socketAppender, consoleAppender 등등..
      • param 엘리먼트 : Appender 인스턴스 생성 시 필요한 값을 제공하는 엘리먼트
    • ⇒ Appender 클래스마다 필요한 이름과 값이 다르게 설정
      • name 속성 : 전달값을 구분하기 위한 식별자를 속성값으로 설정
      • value 속성 : 전달값을 속성값으로 설정
    • layout : 로그 형식을 설정하는 엘리먼트
      • class 속성 : 로그 형식을 제공하는 클래스를 속성값으로 설정
      • param 엘리먼트 : layout 인스턴스에 필요한 값을 제공하는 엘리먼트
      • PatternLayout 클래스는 로그 패턴 문자(Conversion Character)를 제공 (문자만 쓰면 헷갈리므로 %도 같이 씀)
      • Conversion Character
      • %c : 패키지가 포함된 클래스 이름을 기록 - {정수값}을 이용하여 원하는 형식으로 변환
        • ⇒ %c{1} : 패키지를 제외한 클래스 이름만 기록
      • %d : 날짜와 시간 기록 - {SimpleDateFormatPattern}을 이용하여 원하는 형식으로 변환 가능
        • ⇒ %d{yyyy-MM-dd} : [년-월-일] 형식으로 날짜만 기록
      • %m : 로그 메시지 기록
      • %n : 엔터[Enter]기록 - 로그 줄바꿈
      • %M : 호출 메서드 이름 기록
      • %p : 로그 이벤트 기록 - Trace > DEBUG > INFO > WARN > ERROR > FATAL
      • %r : 처리 시간 기록
      • %f : 처리 스레드 이름 기록
      • Conversion Character 자릿수 설정
      • %p : 로그 이벤트를 최대 자리수 제공하여 기록
      • %자릿수p : 로그 이벤트를 최대 자릿수로 제공받아 기록
      • %.자릿수p : 로그이베트를 초소 자릿수를 제공받아 기록
      • %-자릿수p : 로그 이벤트를 최대 자릿수로 제공받아 기록(왼쪽 정렬)
  • Appenders
  • log4j : 장치에 메시지를 기록하는 로그 구현 프로그램

logger : 기록자(appender)를 이용하여 로그를 구현하기 위한 엘리먼트

  • name 속성 : 기록자(Appender)를 이용하여 로그를 구현하기 위한 엘리먼트
  • additivity 속성 : false 또는 true 중 하나를 속성값으로 설정
  • ⇒ false : root 엘리먼트의 appender 제외, true(기본값) : root 엘리먼트의 appender 추가
  • level : 로그 이벤트를 설정하기 위한 엘리먼트
    • value 속성: 로그 이벤트를 속성값으로 설정
    appender는 계속 추가 가능함. (오버라이드가 아님)

로그 구현체를 사용하면 유지보수가 쉬워진다.

Root Logger

root : 최상위 기록 정보 (Logger)를 설정하기 위한 엘리먼트

⇒ 모든 패키지의 클래스에 기본적으로 적용되는 기록 정보

⇒ 모든 Logger 엘리먼트는 root 엘리먼트의 기록 정보를 상속받아 사용

  • priority : 기본 로그 이벤트를 설정하기 위한 엘리먼트
    • value 속성 : 로그 이벤트를 속성값으로 설정
  • appender-ref : 기록자(Appender)를 설정하기 위한 엘리먼트
    • ref 속성 : appender 엘리먼트의 식별자를 속성값으로 설정

Logger

  • 로그 구현체에게 기록을 전달하기 위한 인스턴스

LoggerFactory

  • Logger 인스턴스를 제공하기 위한 클래스
  • LoggerFactory.getLogger(Class<T> class) : 메모리에 저장된 클래스(Clazz)에서 발생된 기록을 로그 구현체에게 전달하는 Logger 인스턴스를 반환하는 메서드
  • Logger.info(String message) : 로그 이벤트를 발생하여 로그 구현체에게 메시지를 전달하는 메서드


 파이널 프로젝트

> DB 마무리 회의

> 디테일 회의 예정

반응형

'레거시' 카테고리의 다른 글

2022.03.07 의 기록  (0) 2022.03.07
2022.03.05~03.06 의 기록  (0) 2022.03.05
2022.02.28의 기록  (0) 2022.02.28
2022.02.27의 기록  (0) 2022.02.27
2022.02.25의 기록  (0) 2022.02.25