▶ 하루
=> 공부 관련
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 속성값으로 사용
- 조건식에 의해 하나의 엘리먼트 내용(SQL문장)이 포함되도록 하는 설정하는 상위 엘리먼트
- ⇒ 다수의 엘리먼트 중 하나의 엘리먼트 내용만 포함
- ⇒ 하위 엘리먼트
- when : 엘리먼트 내용(SQL 문장)의 포함 여부를 설정하는 엘리먼트
- test 속성 : false(SQL 문장 미포함) 또는 true(SQL 문장 포함) 중 하나를 속성값으로 설정
- otherwise : 모든 when 엘리먼트의 test 속성값이 [false] 인경우 엘리먼트 내용을 SQL 명령에 포함하는 엘리먼트
- SQL 문장을 추가하거나 제거하는 기능을 제공하는 엘리먼트
- ⇒ 하위 엘리먼트로 if 엘리먼트 사용
- prefix 속성 : trim 엘리먼트에 SQL 문장이 존재할 경우 SQL 문장 앞부분에 추가될 단어를 속성값으로 설정
- suffix 속성 : trim 엘리먼트에 SQL 문장이 존재할 경우 SQL 문장 뒷부분에 추가될 단어를 속성값으로 설정
- prefixOverrides 속성 : trim 엘리먼트에 SQL 문장이 존재할 경우 SQL 문장 앞부분에서 삭제 될 단어를 속성값으로 설정
- ⇒ | 연산자를 이용하여 제거할 단어를 나열하여 설정 가능
- suffixOverrides 속성 : trim 엘리먼트에 SQL 문장이 존재할 경우 SQL 문장 뒷부분에서 삭제 될 단어를 속성값으로 설정
- WHERE 엘리먼트에 SQL 구문이 존재할 경우 앞부분에 [WHERE] 단어를 추가하는 엘리먼트
- ⇒ 하위 엘리먼트로 if 엘리먼트 사용
- ⇒ where 엘리먼트의 문장 앞부분에 조건식이 아닌 문장이 존재할 경우 제거
- 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란?
- 개발에 있어 기본이 되는 뼈대나 구조를 제공함
- 여러 앱이 비슷한 구조를 가지므로 생산성이 향상되고 유지보수도 쉬움
- 개방 폐쇄 원칙을 따름
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 : 라이브러리 적용 범위
- ⇒ 로그 구현체를 이용한 로깅 처리시 경로에 문제가 있는 경우 해결하기 위한 라이브러리
Spring Framework 프로젝트 생성 시 변경 사항 및 이슈 사항
- 컨텍스트 네임 바꾸기 (서버 더블클릭)
- 프로그램 경로에 한글이 적혀있으면 log4j가 못 읽는다.
- 메이븐이 빌드 안 되었을 시 추가하면 됨(극히 드뭄)
- project facets 에서 java , webmodule 버전 16 , 4.0 버전으로 바꿔라
- 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 : 로그 이벤트를 최대 자릿수로 제공받아 기록(왼쪽 정렬)
- appender : 로그 전달 방식(로그매체)과 로그 형식을 설정하는 엘리먼트(어디에 어떻게 기록할지)
- Appenders
- log4j : 장치에 메시지를 기록하는 로그 구현 프로그램
logger : 기록자(appender)를 이용하여 로그를 구현하기 위한 엘리먼트
- name 속성 : 기록자(Appender)를 이용하여 로그를 구현하기 위한 엘리먼트
- additivity 속성 : false 또는 true 중 하나를 속성값으로 설정
- ⇒ false : root 엘리먼트의 appender 제외, true(기본값) : root 엘리먼트의 appender 추가
- level : 로그 이벤트를 설정하기 위한 엘리먼트
- value 속성: 로그 이벤트를 속성값으로 설정
로그 구현체를 사용하면 유지보수가 쉬워진다.
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 |