※ 스프링 레거시 프로젝트 설명
1. simple projects
- 심플 자바는 자바프로젝트랑 거의 흡사함
- 심플 스프링 메이븐은 현재 사용하고 있는 프로젝트랑 약간 흡사함
1. 톰캣설정
2. nginx 설정
3. 클라우드플레어 설정
※ 복습
1. 스프링 레거시 프로젝트 생성
톰캣 9.0 전환
2. maven의존성 추가 (pom.xml)
2-1 lombok 추가
2-2 spring-test
2-3 mariadb jdbc
2-4 hikariCP
2-5 mybatis
2-6 mybatis-spring
2-7 spring-tx
2-8 spring-jdbc
2-9 java build version update to 1.8
3. root-context.xml
Bean 추가
3-1 hikariConfig bean
3-2 hikariDataSource
3-3 SqlSessionFactoryBean
※ 수업
※ Annotation
0. 역사 및 기초
- 자바 1.5 버전에 나옴
- 우리가 수업하며 가장 처음 본 어노테이션은 @Override이다.
- 자바의정석 어노테이션을 한번 보는게 낫다
0-1 Enum
- 어노테이션을 알기 전에 이넘을 먼저 알아야 한다.
- 상수
1. Spring 관련
1-1 Component
- 어떤 특정 컨텐츠가 bean으로 등록되면 클래스에 s가 붙음
- 등록하는방법 Component(탐색을 시켜야함)
- @service도 bean으로 등록하여 관리할 수 있음.
1-2 Autowired, Inject, Resource
- 프로젝트 구조에 따라 위 3개를 다르게 사용
1-2-1 Autowired
- 필드, 세터, 생성자에 사용 가능
- 타입을 기준으로 의존성을 주입함
- 동일한 타입의 빈이 여러 개 존재할 경우 기본적으로 참조변수의 이름과 동일한 빈을 찾아서 주입
ㄴ 타입을 선행적으로 탐색 (2개이상 있을시 쿼리파이어 혹은 프라이머리 사용)
- 이름을 기준으로 의존성을 주입할때 @Qualifier("지정된 이름")를 사용해서 주입될 빈 지정 가능
ㄴ 주입될 bean 클래스명 상단에 @Component("지정할 이름")을 명시해줘야 함
- 동일한 타입의 빈이 여러 개 존재할 경우 @Primary을 사용해서 주입될 빈 지정 가능
- 소속 위치는 스프링프레임워크 빈즈
1-2-2 Inject
기본적으로 오토와이어드와 동일하게 사용할 수 있으며 추가적으로 @Named를 같이 사용할 수 있음
오토와이어드와 문법이 매우 흡사
- 필드, 세터, 생성자에 사용 가능
- 타입을 기준으로 의존성을 주입함
- 따라서 오토와이어드를 사용한곳에 인젝트로 모두 변경해도 사용가능
- 소속 위치는 자바
1-2-3 Resource
- 필드, 세터에만 사용가능
- 기본적으로 참조변수의 이름과 동일한 빈이 존재하면 해당 빈을 주입해줌
- 자바9 이후부터는 삭제되어서 사용할 수 없음
ㄴ 사용하고싶으면 라이브러리를 추가하면 된다. (jsr 250 버전)
- name속성을 사용해서 주입받을 빈을 지정할 수 있음
- 이름으로 빈을 찾지 못하면 타입을 기준으로 의존성 주입 (이름 > 타입순으로 탐색)
아래글 참고
https://codingnojam.tistory.com/13
※ Enum
사전 정의된 Enum????
예제)
package java_project;
public enum Direction {
NORTH("^", 1), EAST(">", 2), SOUTH("v", 3), WEST("<", 4);
private final String str;
private final int value; // 생성자 호출시점에 값을 정의해줘야함
private Direction(String str, int value) {
this.str = str;
this.value = value;
}
public String getStr() {
return str;
}
public int getValue() {
return value;
}
}
package java_project;
import java.awt.Color;
public class DirectionEx {
public static void main(String[] args) {
String[] ds = {"EAST", "WEST", "SOUTH", "NORTH"};
Direction d = Direction.valueOf("NORTH");
Direction d2 = Direction.WEST;
System.out.println(d);
Direction.valueOf(ds[0]);
Direction.values();
Direction[] directions = Direction.values();
for(Direction direction : directions) {
System.out.println(direction.getStr());
}
switch (d) {
case NORTH:
System.out.println(d.getStr());
break;
case EAST:
System.out.println(d.getStr());
break;
default:
break;
}
// d2.rotate(90);
System.out.println(Color.RED);
}
}
switch와 잘어울린다.
클래스 및 인터페이스와 같은 동률임
상수 그자체를 다루게된다.
* 이넘을 쓰면 좋은 이유
실제 수치값을 저장하는곳이기 때문에
특정 코드스타일에 대한 통제를 할 수 있다. (코드의 가독성이 좋아짐)
예) 캘린더클래스의 연월일 정도
2. Annotation Types
2-1 Deprecated
- 더이상 지원하지 않으니 사용하지 마라는 뜻
예) Date
2-2 FunctionalInterface (함수형 인터페이스)
타겟이 오로지 타입밖에 없음
해당 인터페이스가 함수가 되어야하는 강제사항
추상메서드는 단 1개만 있어야 한다. (0개도 안되고, 2개이상도 안됨) / 람다식의 목적이 될것이라 1개만 있어야함
람다와 관련된것이라고 이해하면 쉽다.
* 제너릭
package java_project;
@FunctionalInterface
public interface FnInter<T, R> {
R b(T t);
}
* 람다식
람다식은 '익명함수'답게 메서드에서 이름과 반환타입을 제거하고 매개변수 선언부와 몸통{} 사이에 ->를 추가한다.
람다식은 실제로는 익명객체이고 인터페이스를 구현한 익명 객체의 메서드와 람다식의 매개변수의 타입과 개수 그리고 반환값이 일치하여야 한다.
그래서 인터페이스를 통해 람다식을 다루기로 결정되었으며 람다식을 다루기 위한 인터페이스(@FunctionalInterface)를 함수형 인터페이스라고 부르기로 했다.
람다식을 참조변수를 다룰 수 있다는 것은 메서드를 통해 람다식을 주고받을 수 있다는것을 의미한다.
interface Func {
int m(int a, int b);
}
위 인터페이스를 이용하여 람다식을 만들면
Func func = (int a, int b) -> a > b ? a : b;
이렇게 되고, 역으로 람다식으로 인터페이스를 만들면
F f = (a) -> a*a;
@FunctionalInterface
interface F {
int m(int a);
}
이렇게 만들 수 있다.
* 람다식의 타입과 형변환
람다식은 오직 함수형 인터페이스로만 형변환이 가능함
* java.util.function 패키지
람다식을 사용하기 위해 인터페이스를 구현하기 너무 귀찮다.
함수형 인터페이스 | 매서드 | 설명 |
java.lang.Runnable | void run() | 매개변수도 없고, 반환값도 없음 |
Supplier<T> | T get() → T | 매개변수는 없고, 반환값은 있음 |
Consumer<T> | T → void accept(T t) | 매개변수만 있고 반환값이 없음 |
Function<T, R> | T → R apply (T t) → R | 일반적인 함수, 하나의 매개변수를 받아서 결과를 반환 |
Predicate<T> | T → boolean test(T t) → boolean | 조건식을 표현하는데 사용됨 매개변수는 하나, 반환타입은 boolean |
* 매개변수가 두 개인 함수형 인터페이스
함수형 인터페이스 | 메서드 | 설명 |
BiConsumer<T, U> | T, U → void accept(T t, U u) | 두개의 매개변수만 있고 반환값이 없음 |
Predicate<T, U, R> | T, U → boolean test(T t, U u) → boolean | 조건식을 표현하는데 사용됨 매개변수는 둘, 반환타입은 boolean |
* UnaryOperator, BinaryOperator
매개변수의 타입과 반환타입의 타입이 모두 일치한다는 점만 제외하고는 Function과 같다
Func func = (int a, int b) -> a > b ? a : b;
BinaryOperator<Long> operator = (a, b) -> a > b ? a : b;
operator.apply(5L, 10L);
F f = (a) -> a*a;
UnaryOperator<Integer> unaryOperator = a -> a * a;
* 컬렉션 프레임웍과 함수형 인터페이스
*메서드와 함수의 차이
객체의 행위 나 동작을 의미하는것을 메서드라고 한다.
함수형인터페이스
람다식이 메서드와 동등한것처럼 설명해왔지만, 사실 람다식은 익명클래스의 객체와 동등하다.
객체가 있어야 메서드를 호출할 수 있다.
* 객체와 인스턴스 구분
// 객체 // 인스턴스
String str = new String();
'Spring > Spring' 카테고리의 다른 글
23-03-29 Spring (0) | 2023.03.30 |
---|---|
23-03-23 Spring (0) | 2023.03.23 |
23-03-22 Spring (0) | 2023.03.22 |
23-03-21 Spring 비밀글 (0) | 2023.03.21 |
23-03-16 Spring (0) | 2023.03.16 |