▶ 오늘 실현 가능한 세부 목표
=> 공부 관련
1) 스트림 Stream / 모던 자바 8 함수형 프로그래밍
2) 자바 리팩토링
3) 금일 배운 내용 복습
4) 스프링 객체지향 책 1단원
=> 파이널 프로젝트 관련
1) 화면 목록 및 검사서 회의
▶ 문제 정리
1. 용어 관련 문제
문제 : 구글링 검색을 하며 공부를 하다보니 모르는 용어 투성이다.
해답 : 계속 검색하며 알아보고 예시를 들어 이해하자.
▶ 공부 내용
MyBatis (Framework)
SqlSessionFactory 인스턴스를 생성하기 위해 필요한 정보를 제공하는 환경 설정 파일
properties : property 엘리먼트를 설정하기 위한 상위 엘리먼트
- resource 속성 : Properties 파일의 경로를 속성값으로 설정
- ⇒ property 엘리먼트 대신 Properties 파일에서 제공되는 이름과 값을 이용
- property : XML 환경설정파일에 필요한 값을 제공하기 위한 엘리먼트
- ⇒ 다른 엘리먼트에서 ${이름} 형식으로 표현하여 설정값을 제공받아 사용
- ⇒ 다수의 엘리먼트에서 공통적으로 사용되는 값을 좀 더 편리하게 이용하고 변경하기 위해 선언
settings : setting 엘리먼트를 설정하기 위한 상위 엘리먼트
- setting : mybatis 실행 시 필요한 값을 제공하기 위한 엘리먼트
- ⇒ mybatis 실행에 필요한 값을 기본값으로 제공하므로 기본값이 아닌 값을 사용할 경우 setting 엘리먼트 선언
typeAliases : typeAlias 엘리먼트를 설정하기 위한 상위 엘리먼트
- typeAlias : 맵퍼에서 사용되는 Java 자료형의 별칭(AliasName)을 설정하기 위한 엘리먼트
- ⇒ 맵퍼에서 Java 자료형을 보다 쉽게 표현하기 위해 사용
- ⇒ mybatis 내부적으로 설정된 Java 자료형에 대한 별칭 존재
- type 속성 : Java 자료형을 속성값으로 설정
- alias 속성 : Java 자료형에 대한 별칭을 속성값으로 설정
- package : 특정 패키지에 선언된 모든 클래스에 대한 별칭을 자동 설정하는 엘리먼트
- ⇒ 패키지에 선언된 모든 클래스는 패키지를 제외한 클래스명이 별칭으로 등록
- name 속성 : 별칭을 설정하고자 하는 클래스가 선언된 패키지를 속성값으로 설정
environments : environment 엘리먼트를 설정하기 위한 상위 엘리먼트
- ⇒ default 속성 : mybatis 프레임워크에서 사용할 environment 엘리먼트의 식별자를 속성값으로 설정
- environment : DBMS 서버에 접속하기 위한 정보를 제공하기 위한 상위 엘리먼트 (커넥션이라 생각해도 무방 DBMS는 여러개일 수 있다)
- ⇒ DBCP 인스턴스와 Connection 인스턴스를 생성하기 위한 정보 제공
- id 속성 : environment 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정
- transactionManager : 트랜잭션 관리자를 설정하기 위한 엘리먼트
- ⇒ 트랜잭션 관리자(TransactionManager) : 트랜잭션의 SQL 명령을 커밋하거나 롤백하기 위한 관리자
- type 속성 : [jdbc] (내부) 또는 [MANAGED] (외부) 중 하나를 속성값으로 설정
- ⇒ JDBC 속성값 : JDBC 기능을 사용하여 커밋과 롤백을 처리
- ⇒ MANAGED 속성값 : 트랜잭션 관리자 프로그램을 사용하여 커밋과 롤백 처리
- dataSource : Connection 인스턴스를 생성하기 위한 정보를 설정하는 엘리먼트
- type 속성 : [UNPOOLED], [POOLED], [JNDI] 중 하나를 속성값으로 설정
- ⇒ UNPOOLED 속성 값 : DBCP 기능을 사용하지 않고 Connection 인스턴스 제공
- ⇒ POOLED 속성 값 : DBCP 기능을 사용하여 Connection 인스턴스 제공
- ⇒ JNDI 속성 값 : JNDI 기능을 사용하여 Connection 인스턴스 제공
⇒ property : Connection 인스턴스를 생성하기 위한 값을 제공하기 위한 엘리먼트
mappers : mapper 엘리먼트를 설정하기 위한 엘리먼트
- mapper : SQL 명령이 등록된 맵퍼 파일의 경로를 설정하기 위한 엘리먼트
- ⇒ XML 기반의 맵퍼 파일과 Interface 기반의 맵퍼 파일 존재
- ⇒ ibatis에서는 XML 기반의 맵퍼 파일만 존재
- resource 속성 : XML 기반의 맵퍼 파일의 경로를 속성값으로 설정
- ⇒ XML 파일의 경로는 파일 시스템 형식으로 표현3
- class 속성 : Interface 기반의 맵퍼 파일의 경로를 속성값으로 설정
Mapper
- SQL 명령을 등록하기 위한 파일
- ⇒ mybatis 환경설정파일에서 mapper 엘리먼트를 이용하여 맵퍼로 등록
mapper
- SQL 명령을 등록하기 위한 최상위 엘리먼트
- namespace 속성 : 맵퍼를 구분하기 위한 식별자를 속성값으로 설정
- ⇒ 다른 맵퍼에 등록된 SQL 명령과 구분하기 위해 사용
- ⇒ 속성값은 맵퍼 파일의 경로를 Java 자료형의 형식으로 표현하여 설정하는 것을 권장
- ⇒ [ibatis] 에서는 namespace 속성이 생략 가능하지만 [mybatis] 에서는 필수 속성
select
- SELECT 명령을 등록하기 위한 엘리먼트
- id 속성 : SQL 명령이 등록된 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정
- resultType 속성 : SQL 명령의 실행 결과(행)를 매핑하여 제공하기 위한 Java 자료형을 속성값으로 설정
- ⇒ select 명령으로 실행된 결과(행)을 Java 자료형의 객체(값)으로 매핑 처리
- ⇒ 속성값이 DTO 클래스인 경우 DTO 인스턴스를 생성하여 검색행의 컬럼값을 같은 이름의 필드에 자동으로 저장하여 제공 - 자동 매핑
- ⇒ resultType 속성값으로 Java 자료형 대신 typeAlias 엘리먼트에서 설정한 별칭 사용 가능
insert
- INSERT 명령을 등록하기 위한 엘리먼트
- id 속성 : SQL 명령이 등록된 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정
- parameterType 속성 : SQL 명령에 필요한 값이 저장된 인스턴스의 Java 자료형을 속성값으로 설정
- ⇒ Java 자료형 대신 typeAlias 엘리먼트로 설정된 별칭 사용 가능
- ⇒ SQL 명령에 필요한 값이 없는 경우 parameterType 속성 생략
- DML (INSERT, UPDATE, DELETE) 명령 관련 엘리먼트는 등록된 SQL 명령 실행 후 조작행의 갯수를 정수값(Integer)으로 무조건 반환하므로 resultType 엘리먼트 생략
- parameterType 속성으로 전달된 값은 SQL 명령에서 #{변수명|필드명|맵키} 형식으로 전달
- ⇒ ibatis는 #변수명|필드명|맵키# 형식으로 값 표현
update
- UPDATE 명령을 등록하기 위한 엘리먼트
delete
- DELETE 명령을 등록하기 위한 엘리먼트
DAO
SqlSessionFactory
- 인스턴스를 생성하여 반환하는 메서드
- ⇒ SqlSessionFactory 인스턴스를 생성하기 위한 mybatis 환경설정파일
- SqlSession 인스턴스를 생성하여 반환하는 인스턴스
- ⇒ 이 인스턴스가 dao 메서드를 만들어줌
Resources.getResourceAsStream(String resource)
- 서버 컨텍스트로 존재하는 리소스 파일의 경로를 제공받아 입력스트림을 생성하여 반환하는 메서드
SqlSessionFactoryBuilder
- SqlSessionFactory 인스턴스를 생성하는 기능을 제공하는 인스턴스
- build(InputStream inputStream) : mybatis 환경설정파일을 입력스트림을 이용하여 제공 받아 SqlSessionFactory 인스턴스를 생성하여 반환하는 메서드
SqlSessionFactory.openSession()
- SqlSession 인스턴스를 생성하여 반환하는 메서드
SqlSession
- DBMS 서버에 접속해서 맵퍼에 등록된 SQL 명령을 제공받아 전달하여 실행하고 실행결과를 Java 자료형의 객체(값)로 매핑하는 인스턴스
- selectList(String elementId) : 맵퍼에 등록된 Select 명령을 제공받아 실행하고 SELECT 명령의 처리결과를 List 인스턴스로 반환하는 메서드
- ⇒ elementId : 맵퍼의 mapper 엘리먼트의 namespace 속성값과 select 엘리먼트의 id 속성값을 이용하여 맵퍼에 등록된 SQL 명령을 제공받기 위한 식별자
- close() : SqlSession 인스턴스를 제거하는 메서드
- insert(String elementId, Object parameterValue) : INSERT 명령이 등록된 엘리먼트의 SQL 명령을 제공받아 실행 후 삽입행의 갯수를 반환하는 메서드
- ⇒ parameterValue : SQL 명령에 필요한 값이 저장된 인스턴스를 전달받아 저장, 전달 값이 없는 경우 매개변수 생략 가능
mybatis 프레임워크는 기본적으로 Autocommit 기능을 비활성화 처리하고 SQL 명령을 실행
⇒ DML 명령을 전달하여 실행한 경우 반드시 트랜잭션 관련 메서드를 호출
- SqlSession.commit() : 트랙잭션 적용 명령(commit) 을 전달하여 실행하는 메서드
- SqlSession.rollback() : 트랜잭션 취소 명령(rollback)을 전달하여 실행하는 메서드
- SqlSessionFactory.openSession(boolean autoCommit) : SqlSession 인스턴스를 생성
- ⇒ false : autocommit 비활, true : 활성화
Javascript
- history.back() : 전페이지로 이동
▶ 개인 공부
익명 객체
- 이름이 없는 객체
- 사용 목적 : 이벤트 처리 / 스레드 객체를 간편 생성하기 위해
- 사용 용도 : 필드 / 로컬변수의 초기값, 매개변수의 매개값으로 사용
- 단독으로 생성 불가. 클래스 상속 or 인터페이스 구현으로 사용 가능
- 일회성
익명 자식 객체 생성
- 자식 클래스가 재사용 되지 않고, 필드/변수의 초기값으로만 사용할 경우는 익명 자식 객체를 생성하여 초기값으로 대입하는 것이 제일 좋다.
- 익명 자식 객체에 새롭게 정의된 필드와 메서드는 객체 내부에서만 사용. 외부에서는 필드와 메서드에 접근 불가.
- ⇒ 부모 타입 변수에 대입되므로, 부모 타입에 선언된 것만 사용 가능하기 때문. (형변환하면 되지 않을까???)
익명 구현 객체 생성
- 인터페이스 타입으로 필드와 변수를 선언하고, 구현 객체를 초기값으로 대입하는 경우
- 마찬가지로 구현 클래스가 재사용 되지 않고, 필드/변수의 초기값으로만 사용할 경우는 익명 구현 객체를 생성하여 초기값으로 대입하는 것이 제일 좋다.
- 주의할 점으로 중괄호 안에는 인터페이스의 모든 추상 메서드를 재정의 해야함!
익명 객체의 로컬 변수 사용
- 익명 객체 내부에서는 외부 클래스의 필드와 메서드를 사용 가능.
- 메서드의 매개변수와 로컬변수를 익명 객체에서 사용할 때 문제 발생
- ⇒ 왜?
- 메서드 내에 생성된 익명 객체는 메서드 실행 종료 후 계속 heap 메모리에 존재해서 사용 가능.
- 매개변수나 로컬변수는 메서드 종료 시 stack에서 사라지므로 익명 객체에서 사용 불가.
- 익명 객체 내부에서 메서드의 매개변수나 로컬변수를 사용 시 final 특성을 지녀야 함
- (자바 8 이후는 자동으로 특성을 지니게 됨)
모던 자바 - Java 8
함수형 프로그래밍은 왜 필요한가?
- 처리 자체를 데이터와 완전히 분리하는 것
- 함수를 다른 함수의 인자값으로 넘겨줌으로써 병렬 처리 구현이 쉬워짐. ⇒ 요게 핵심..
- 병렬 처리를 위해서 값은 스트림으로 처리되며 이 처리와 관련된 API가 자바 8의 핵심
함수형 관점으로 생각하자
선언형 프로그래밍
- 어떻게가 아닌 무엇을에 집중하는 프로그래밍 방식.
- 질의문 자체로 문제를 어떻게 풀어나갈지 보여주는 점이 명령형 프로그래밍과의 차이.
- 원하는 것이 무엇이고 시스템이 어떻게 목표를 달성하게 할 것인지의 규칙을 세움.
함수형 프로그래밍
- 함수를 이용하는 프로그래밍 ⇒ 함수는 부작용이 없어야 함
- 함수형 : 수학의 함수처럼 부작용이 없다 ?
- ⇒ 함수는 시스템의 다른 부분에 영향을 미치지 않아야 한다 → 참조 투명성
- 인수가 같다면 수학적 함수를 반복적으로 호출했을 때 항상 같은 결과가 반환
참조 투명성
- 참조 투명성이란 '부작용을 감춰야 한다'라는 제약으로 귀결된다. 같은 인수로 함수를 호출했을 때 항상 같은 결과를 반환한다면 참조적으로 투명한 함수라 표현한다. 참조 투명성은 다음과 같은 장점이 있다.
- 프로그램 이해에 큰 도움을 준다.
- 오래 걸리는 연산에 대해 기억화(memorization) 또는 캐싱(caching)을 통해 최적화할 수 있다
객체지향 프로그래밍과 함수형 프로그래밍
- 객체지향 프로그래밍과 함수형 프로그래밍은 반대되는 속성을 가진다.
객체지향 프로그래밍은 모든 것을 객체로 간주하며, 프로그램이 객체의 필드를 갱신하고, 메서드를 호출하여 관련 객체를 갱신하는 방식으로 동작한다. 반대로, 함수형 프로그래밍은 참조적 투명성을 중요시한다. 즉, 변화를 허용하지 않는 방식이다.
함수형 프로그래밍 기법
고차원 함수(higher-order functions)
- 함수를 인수로 받아서 다른 함수로 반환하는 정적 메서드를 고차 함수라고 부른다. 고차원 함수를 적용할 때 어떤 인수가 전달될지 알 수 없으므로 인수가 부작용을 포함할 가능성을 염두에 두어야 한다. 따라서 인수로 전달된 함수가 어떤 부작용을 포함하게 될지 정확하게 문서화하는 것이 좋다.
커링(currying)
- 커링은 x와 y라는 두 인수를 받는 함수 f를 한개의 인수를 받는 g라는 함수로 대체하는 기법이다. 이때 g라는 함수 역기 하나의 인수를 받는 함수를 반환한다. 이때 함수 g의 상태는 여러 과정이 끝나지 않은 상태를 가리켜 '함수가 부분적으로(partially) 적용되었다'라고 말한다.
- 커링은 함수를 모듈화하고 기존 변환로직을 재활용할 수 있도록 하는 기법이다.
영속(persistent) 자료구조
- 함수형 프로그램에서 사용하는 자료구조는 영속 자료구조이다. 영속 자료구조는 갱신될 때 기존 버전의 자신을 보존한다. 결과적으로 자신을 복사하는 과정이 따로 필요하지 않다. 계산 결과를 표현할 자료구조가 필요하면 기존 자료구조를 갱신하지 않도록 새로운 자료구조를 만들어야 한다. 대신 전체를 새로 만드는 것이 아닌 인수를 이용하여 가능한 한 많은 정보를 공유하도록 만드는 것이 중요하다.
- 함수형 자료구조에서 말하는 영속은 저장된 값이 다른 누군가에 의해 영향을 받지 않는 상태를 말한다. 그렇기 때문에 결과 자료구조를 바꾸지 않아야 하는 것이다.
스트림의 자기참조
- 스트림은 단 한 번만 소비할 수 있다. 그렇기에 자바의 스트림은 재귀적으로 자신을 정의할 수 없다.
게으른 평가(lazy evaluation)
- 자바에서는 메서드를 호출하면 모든 인수가 즉시 평가된다. 하지만 스트림에서는 연산을 적용하면 바로 수행되지 않으며, 최종 연산을 적용해서 실제 계산을 해야 하는 상황에서만 실제 연산이 이루어진다. 이 이유는 스트림의 인자가 함수이기 때문이다.
- 자바 8 이후 함수가 일급 시민이 되면서 함수를 자료구조 내부로 추가할 수 있으며, 이런 함수는 자료구조를 만드는 시점이 아니라 요청 시점에 실행된다. 함수형 인터페이스인 Supplier <T>를 이용하여 게으른 자료구조를 만들 수 있다. Supplier 함수를 호출함으로 자료구조의 요소를 생성하는 것이다.
패턴 매칭(pattern matching)
- 함수형 프로그래밍의 중요한 특징으로는 패턴 매칭을 들 수 있다. 이는 정규표현식과 관련된 매칭과는 다르다. 여기서의 패턴 매칭은 한 개 이상의 파라미터에 대한 멀티 매칭을 의미한다. 자바에서는 패턴 매칭 대신 if-then-else 구문을 중첩하여 구현할 수 있지만, 스칼라에서는 이미 패턴 매칭을 지원하고 있다. 쉽게 표현하면 다수준(multilevel)의 switch 문이라고 설명할 수 있다. 아래 예제를 통해 패턴 매칭이 무엇인지 이해할 수 있다.
def simplifyExpression(expr: Expr): Expr = expr match {
case BinOp("+", e, Number(0)) => e// 0 더하기case BinOp("*", e, Number(1)) => e// 1 곱하기case BinOp("/", e, Number(1)) => e// 1 나누기case _ => expr// expr을 단순화할 수 없다
}
⇒ 자바에서 함수형 프로그래밍을 통해 패턴 매칭을 흉내 낼 수 있다.
캐싱(caching) 또는 기억화(memorization)
- 참조 투명성이 유지되는 상황이라면 기억화를 이용하여 추가 오버헤드를 피할 수 있다. 기억화는 메서드에 래퍼로 캐시를 추가하는 기법이다.
'같은 객체를 반환함'의 의미
- 참조 투명성은 '인수가 같다면 결과도 같아야 한다'라는 규칙을 만족해야 한다. 하지만 논리적으로 같은 데이터이나 같은 참조를 갖지 않으면 서로 다른 참조이므로 == 연산이 성립되지 않는다. 그러나 자료구조를 변경하지 않는 상황에서 참조가 다르다는 것은 큰 의미가 없으며 논리적으로 같기에, 함수형 프로그래밍에서는 구조적인 값이 같다면 둘은 같은 객체라고 할 수 있다.
콤비네이터
- 함수형 프로그래밍에선 함수를 인자로 받고 조합하며 결과로 함수를 반환하는 형식의 고차원 함수를 많이 사용하게 된다. 이처럼 함수를 조합하는 기능을 콤비네이터라고 부른다.
▶ 파이널 프로젝트
> 필수 항목 & 유효성 완료
> 정기 배송 확장성 질문
> 게시글 작성 통일 가능 여부 질문
> 9시 UI 회의
반응형
'레거시' 카테고리의 다른 글
2022.02.25의 기록 (0) | 2022.02.25 |
---|---|
2022.02.24 의 기록 (0) | 2022.02.24 |
2022.02.22의 기록 (0) | 2022.02.22 |
2022.02.21의 기록 (0) | 2022.02.21 |
2022.02.20의 기록 (0) | 2022.02.20 |