▶ 오늘 실현 가능한 세부 목표
=> 공부 관련
1) 스트림
2) 자바 리팩토링
3) 금일 배운 내용 복습
4) 스프링 객체지향 책 1단원
=> 파이널 프로젝트 관련
1) 화면 설계서 회의 (트레이너 관리 부분)
▶ 문제 정리
1. 익명 객체의 개념 정의가 확실치 않아서 람다식의 이해가 어려웠다.
=> 익명 객체(클래스)의 개념 확실히 정리
=> 일회성의 이벤트이므로 객체에 따로 정의하는 것임.
▶ 공부 내용
JSTL (Java Standard Tag Library)
foreach 태그
- 태그내용을 반복적으로 포함하여 출력하기 위한 태그
- var 속성 : 스코프 객체에 저장된 속성값
- begin 속성 : 스코프 객체에 저장될 시작값(Integer)을 속성값으로 설정
- end 속성 : 스코프 객체에 저장될 종료값(Integer)을 속성값으로 설정
- step 속성: 증가값(Integer)을 속성값으로 설정
⇒ foreach 태그는 배열 또는 컬렉션의 요소 값을 반복적으로 제공받아 처리하는 기능 제공
- var 속성 : 요소 값을 저장하기 위한 스코프 객체의 속성명
- items 속성 : 반복 처리할 배열 또는 컬렉션을 속성값으로 설정
fortokens 태그
- 스코프 객체에 저장된 속성값을 특정 문자열로 분리하여 반복 처리하는 태그
- items 속성 : 분리하기 위한 스코프 객체의 속성값(String)을 속성값으로 설정
- delims 속성 : 분리하기 위한 구분값(String)을 속성값으로 설정
- var 속성 : 분리된 값을 반복적으로 제공받기 위한 속성명을 속성값으로 설정
import 태그
- 다른 웹프로그램의 실행 결과를 응답받아 포함하는 기능을 제공하는 태그
- url 속성 : 응답 결과를 포함시킬 웹프로그램의 URL 주소를 속성값으로 설정
- ⇒ include 액션 태그와 유사한 기능을 제공
- include 태그는 현재 서버의 웹프로그램만을 요청하여 실행결과를 응답받아 포함하지만 import 태그는 다른 서버의 웹프로그램을 요청하여 실행 결과를 응답받아 포함 가능
- ⇒ HTML의 iframe 태그와 유사한 기능을 제공
- URL 관리 태그에는 param 태그를 하위태그로 사용하여 값 전달 가능
param 태그
- 요청 웹프로그램에게 값을 전달하기 위한 태그
- ⇒ URL 관리 태그의 종속 태그
- ⇒ URL 관리 태그에 param 태그를 제외한 코드가 존재할 경우 에러 발생 - JSP 주석 예외
redirect 태그
- 클라이언트에게 URL 주소를 전달하여 재요청 하도록 응답하는 태그
- url 속성 : 클라이언트가 재요청할 웹프로그램의 URL 주소를 속성값으로 설정
Core - URL 관리 태그
- 서버에 저장된 리소스 파일(멀티미디어 파일, CSS 파일, JS 파일 등)을 상대경로로 표현하여 제공
- 상대경로 : 현재 요청 웹프로그램의 경로를 기준으로 리소스 파일의 경로 표현하는 방법
- 요청 웹프로그램(Controller)과 응답 웹프로그램(View)의 경로가 다른 경우 404 에러코드 발생
- ⇒ 서버에 저장된 리소스 파일은 절대경로로 표현하여 제공하는 것을 권장
- 절대 경로 : 최상위 디렉토리(서버 디렉토리)를 기준으로 리소스 파일의 경로를 표현하는 방법
- 리소스 파일이 동일한 서버에 존재할 경우 접속 서버 생략 가능
- ⇒ 컨텍스트명이 변경되는 컨텍스트 경로도 변경되므로 404 에러코드 발생 가능
- request.getContextPath() 메서드를 호출하여 컨텍스트 경로를 반환받아 리소스 파일의 절대 경로 설정
- EL 표현식에서 pageContext 내장객체를 사용하여 컨텍스트 경로를 제공 받아 리소스 파일의 절대 경로 표현
url 태그 (자주 사용되므로 잘 알아두자)
- 컨텍스트 경로가 포함된 리소스 파일의 절대경로를 제공하는 태그
- value 속성 : 컨텍스트 경로를 제외한 리소스 파일의 절대경로를 속성값으로 설정
필터 클래스 Filter Class
- 특정 웹프로그램 요청에 대해 동작 전 실행될 명령과 동작 후 응답 전 실행 될 명령을 작성하기 위한 클래스
- ⇒ 웹 프로그램 동작 전 실행될 명령 : request 메세지(HttpServletRequest Intance)의 정보를 변경
- ⇒ 웹 프로그램 동작 후 실행될 명령 : response 메세지(HttpServletResponse Intance)의 정보를 변경
- 필터 클래스는 반드시 Filter 인터페이스를 상속 받아 작성
- ⇒ 필터 클래스는 @WebFilter 어노테이션 또는 web.xml 파일의 filter 엘리먼트를 사용하여 필터로 동작되도록 설정
FilterChain.doFilter(ServletRequest request, ServletResponse response)
- 클라이언트가 요청한 웹프로그램을 연결하여 실행되도록 설정하는 메서드
Formatter - 날짜와 시간 변환 태그
formatDate 태그
- 스코프 객체에 저장된 Date 인스턴스의 날짜와 시간을 원하는 패턴의 문자열로 변환하여 제공하는 태그 - SimpleDateFormat 클래스와 유사
- value 속성 : Date 인스턴스를 속성값으로 설정
- type 속성 : date(날짜), time(시간), both(날짜와 시간) 중 하나를 속성값으로 설정
- ⇒ 속성값이 [date]인 경우 기본적으로 [yyyy.M.d] 패턴의 문자열로 변환되어 제공
- dateStyle 속성 : full 또는 short 중 하나를 속성값으로 설정
- ⇒ 속성값이 [full]인 경우 기본적으로 [yyyy년 M월 d일 E요일] 패턴의 문자열로 변환되어 제공
- ⇒ 속성값이 [short]인 경우 기본적으로 [yy.M.d] 패턴의 문자열로 변환되어 제공
- ⇒ 속성값이 [time]인 경우 기본적으로 [a h.mm.ss] 패턴의 문자열로 변환되어 제공
formatNumber태그
- 스코프 객체에 저장된 숫자값을 원하는 패턴의 문자열로 변환하여 제공하는 태그
- → DecomalFormat 클래스
- value 속성 : 숫자값이 저장된 인스턴스를 속성값으로 설정
- type 속성 : number 또는 current 중 하나를 속성값으로 설정
- ⇒ 속성값이 [number] : 숫자 3자리마다 ,가 삽입된 형식의 문자열로 변환되어 제공
- ⇒ 속성값이 [currency] : 앞에 화폐기호가 삽입되고 숫자 3자리마다 ,가 삽입된 형식의 문자열로 변환 제공
- pattern 속성 : 숫자를 표현하는 패턴문자를 속성값으로 설정
Functions - EL 함수
web.xml
filter
- 필터 클래스를 필터로 설정하는 엘리먼트
- ⇒ servlet 엘리먼트 선언 전에 작성하는 것을 권장
filter-mapping
- 필터가 동작되기 위한 URL 주소를 설정하는 엘리먼트
- url-pattern에 /* 을 하면 클라이언트의 모든 요청에 대한 필터가 동작되도록 설정
init-param
- 실행 클래스에게 값을 전달하기 위한 엘리먼트
MyBatis 프레임워크
- DAO를 만들어주는 것.
- 프레임워크 : 작성된 코드를 가지고 알아서 만들어 줌.
- log 프로그램 : 기록하는 프로그램, 로그 파일로 로그 서버에 저장
- erp 관리 프로그램의 경우 모든 것을 기록해야한다. 문제 발생 시 역추적 가능.
- slf4j : 실제 기록하는 라이브러리
- lib에 있는 lib들은 의존관계이다.
[모든 프로그램은 기록하는 것이 중요하다]
로깅
- 마이바티스는 내부 로그 팩토리를 사용하여 로깅 정보를 제공.
- 내부 로그 팩토리는 로깅 정보를 다른 로그 구현체 중 하나에 전달한다.
→ 무슨 로그 파일을 쓸 지 xml파일에서 매핑해줘야 함.
▶ 개인 공부
Object 클래스의 동일성 & 동등성
- 동일성 (Identival) : 두개의 객체가 완전히 같은지, == 비교
- ⇒ 객체가 참조하고 있는 주소 값을 비교, 그래서 속성과 타입이 같아도 참조값이 다르면 다른 객체로 구분함.
- 동등성 (Equivalent) : 동일한 정보를 담고 있는지 equals() 비교
- ⇒ 즉, 객체의 멤버 필드가 가리키는 값들이 서로 같다는 것을 의미함. 두 객체가 논리적으로 같은지를 비교하는 셈
참고로 String은 동일성(==) 비교를 해도 true. String의 특성때문이다.
JVM에서는 String을 조금 특별히 관리하기 때문에, 객체이지만 new연산자가 아니라 리터럴("")을 이용해서 String 을 생성 할 수있다. 이때 JVM은 객체의 영역인 heap 영역이 아니라, constant pool 영역으로 찾아간다. 그리고 constant pool 영역에 이전에 같은 값을 가지고 있는 String 객체가 있다면, 그 객체의 주소값을 반환하여 참조하도록 한다.
HashMap & HashSet의 차이?
1. 정의
HashMap은 Map 인터페이스의 구현체로,
HashTable과 유사한 자료구조로 데이터를 저장한다.
HashSet은 Set 인터페이스의 구현체로,
내부적으로 HashMap을 사용하기 때문에
역시나 HashTable과 유사한 자료구조로 데이터를 저장한다.
2. 데이터 저장 형태
HashMap은 Key-Value 쌍 형태로 데이터를 저장한다.
Key와 Value의 mapping을 유지하고 있다.
HashSet은 객체 그 자체를 저장한다.
위에서 HashMap을 내부적으로 사용한다고 했는데,
Key 값으로는 삽입되는 객체 그 자체를,
Value 값으로는 HashSet 내부 구현 코드에서
미리 선언해둔 dummy 객체를 사용한다.
3. 중복 허용 여부
HashMap은 중복 Key 값을 허용하지 않지만,
중복 Value 값은 허용한다.
ex. {'a': 1, 'b': 1, 'c': 2}
HashSet은 객체 자체를 데이터로 저장하기 때문에
중복을 허용하지 않는다.
ex. {'a', 'b', 'c'}
4. NULL 허용 여부
HashMap은 단 하나의 NULL 값을 Key 값으로 가질 수 있고,
(중복 Key 값을 허용하지 않기 때문에)
여러 NULL 값을 Value 값으로 가질 수 있다.
HashSet은 단 하나의 NULL 값을 가질 수 있다.
5. 데이터 삽입 방법
HashMap은 put() 메서드를 사용하여 데이터를 삽입하는데,
Key-Value 쌍 데이터의 형태를 저장하기 때문에
삽입 연산 동안 단 하나의 객체가 생성된다.
HashSet은 add() 메서드를 사용하여 데이터를 삽입하는데,
객체 그 자체를 저장하고
내부적으로 HashMap을 사용하기 때문에,
삽입되는 객체(Key값)와 dummy 객체(Value 값),
총 두 개의 객체가 삽입 연산 동안 생성된다.
성능
이전 글에서도 언급한 것처럼,
HashMap이 HashSet보다 빠르다.
이유는 HashSet에 대해 작성한 이전 글을 참고하자.
그래서 데이터의 유일함(Uniqueness)을 유지하기 위해
항상 HashMap이 HashSet보다 선호된다.
▶ 파이널 프로젝트
> 화면 목록 질문 정리
> 유효성 검사 정리 중
> 내일 디코 회의
'레거시' 카테고리의 다른 글
2022.02.24 의 기록 (0) | 2022.02.24 |
---|---|
2022.02.23의 기록 (0) | 2022.02.23 |
2022.02.21의 기록 (0) | 2022.02.21 |
2022.02.20의 기록 (0) | 2022.02.20 |
2022.02.19의 기록 (0) | 2022.02.19 |