Spring/Spring

23-03-17 Spring

모건이삼촌 2023. 3. 17. 18:07

※ 스프링 레거시 프로젝트 설명

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