반응형

1. 기본키(key)

: 필드의 일부로, 레코드를 유일하게 식별해 낼 수 있는 식별자 역할을 함

-> 관계형 데이터 모델에서 특정 레코드를 구별하기 위한 유일한 방법

 

2. 두 개 이상의 필드로 구성된 복합키를 가질 수도 있음

ex) '학번'과 '주민등록번호' 필드는 레코드마다 유일하므로 키가 될 수 있음

 

 

 

3. 키의 종류

1) 수퍼키 

: 아무런 제약 조건없이 레코드들을 식별할 수 있는 필드의 집합

ex)(주민등록번호), (학번, 주민등록번호)

 

2) 후보키(기본키가 되기위한)

: 레코드를 구별하는데 불필요한 필드를 제외하고 최소한의 필드로만 구성

ex)(주민등록번호), (학번),(이름,학과명)

 

3) 기본키

: 후보키 중에서 레코드들의 식별자로 선택한 하나의 키

ex)(주민등록번호), (학번)

 

 

 

 

여기서 잠깐!!

Quiz 1) (이름, 주소), (이름, 학과명)이 후보키/기본키 자격이 있는가?

-> 있다! 테이블의 모든 가능한 인스턴스에 대해서도 키가 되는 것이 보장되어야 함

 

Quiz 2) 키가 null이 될 수 있나?

-> 기본키는 null 값을 가질 수 없다! null 값을 가지면 식별자로서의 기능을 상실하기 때문이다.

 

 

 

 

4. 외래키(foreign key)

: 다른 테이블의 기본키를 참조하는 필드 집합

 

 

두 스키마 R1, R2에 대하여,

R1의 기본키를 R2가 외래키로서 참조하려면

- R1의 기본키 필드와 R2의 외래키 필드가 동일한 도메인을 가져야 함

- R2의 각 레코드들은 R1 기본키 필드의 값 중 하나와 일치하거나 null 값을 가져야 함

 

* 만약 외래키가 null일 경우, 그 값을 알지 못하거나 아직 결정되지 않았음을 의미함

 

 

 

 

- 자기 자신을 참조하는 외래키가 있을 수도 있음

 

 

반응형
반응형

빈과 일반 객체의 차이는 !

ApplicationContext 에서 가져오는지 아닌지

즉, ApplicationContext가 만들어서 그 안에 담고 있는 객체를 빈(Bean) 이라고 할 수 있음

 

 

1. 빈으로 등록하는 방법

1) ComponentScan

-> 모든 @Component를 찾아서 빈으로 등록함

: @Controller @Repository @Service @Configuration

 

-> @Component라는 메타 어노테이션을 사용한 어노테이션이므로 @Component라고 볼 수 있으므로 똑같이 빈으로 등록됨

( Repository는 어노테이션이 아니라 인터페이스 상속 받는 방식)

 

 

 

 

- 빈으로 등록되었는지 샘플로 테스트

package org.springframework.samples.petclinic.sample;

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;

@RunWith(SpringRunner.class)
@SpringBootTest
class SampleControllerTest {

	@Autowired
	ApplicationContext applicationContext;

	@Test
	public void testDI(){
		SampleController bean = applicationContext.getBean(SampleController.class);
		assertThat(bean).isNotNull();
	}
}

 

 

 

2) 직접 빈으로 등록

 

@Configuration
public class SampleConfig {

	@Bean
	public SampleController sampleController(){
		return new SampleController();
	}
}

-> SampleController 클래스가 빈으로 등록이 된다.

 

 

 

 

 

2. 적용해보기

1) ApplicationContext에서 직접 꺼내오기

private final OwnerRepository owners;
	private final ApplicationContext applicationContext;

	private VisitRepository visits;

	public OwnerController(OwnerRepository clinicService, VisitRepository visits, ApplicationContext applicationContext) {		// IoC
		this.owners = clinicService;
		this.visits = visits;
		this.applicationContext = applicationContext;
	}

	@GetMapping("/bean")
	@ResponseBody
	public String bean() {
		return "bean : " + applicationContext.getBean(OwnerController.class) + "\n"  // 애플리케이션컨텍스트에서 직접 꺼낸 오너리파지토리
			+  "owners : "  + this.visits;											// 애플리케이션컨텍스트가 알아서 주입해준 오너리파지토리?
																					// ? 왜 다르지, 왜 밑에꺼는 jpa를 반환하지
	}

 

2) Autowired 로 가져오기

@Autowired
private OwnerRepository owners;
반응형
반응형

1. 이벤트 리스너 : 이벤트가 발생할 때 알려주는 것

public class SampleListener implements ApplicationListener<ApplicationStartingEvent> {

    @Override
    public void onApplicationEvent(ApplicationStartingEvent applicationStartingEvent) {
        System.out.println("==========================");
        System.out.println("Application is Starting...");
        System.out.println("==========================");
    }
}

SampleListener.java

 

But, ApplicationStartingEvent는 ApplicationContext가 만들어지기 전에 발생하기 때문에 

빈에 넣어준다고 하더라도 실행되지 않는다.

 

@SpringBootApplication
public class Application {

	public static void main(String[] args) {

		SpringApplication app = new SpringApplication(Application.class);
		app.addListeners(new SampleListener());
		app.run(args);

	}
}

Application.java

 

메인에서 app.addListeners(new SampleListener()); 로 직접 만들어 주어야 한다.

 

 

2. ApplicationContext가 만들어진 후에 발생하는 이벤트들은 @Component 로 빈에 등록하여 실행시켜주면 된다.

@Component
public class SampleListener implements ApplicationListener<ApplicationStartedEvent> {

    @Override
    public void onApplicationEvent(ApplicationStartedEvent applicationStartedEvent) {
        System.out.println("==========================");
        System.out.println("Application is Started...");
        System.out.println("==========================");
    }
}

SampleListener.java

 

- ApplicationStartedEvent는 ApplicationContext가 만들어진 후에 발생한다.

 

 

 

3. app.setWebApplicationType();

에는 WebApplicationType.NONE, WebApplicationType.SERVLET, WebApplicationType.REACTIVE가 있다.

 

기본적으로는 SERVLET !

WebFlux를 사용하고 싶다면, REACTIVE

사용하고 싶지 않다면, NONE

 

 

 

4. 애플리케이션 아규먼츠 사용하기

* ApplicationArguments

SpringApplication을 실행할 때 program arguments에 대해 추상화된 액세스 기능을 제공하는 인터페이스이다.

 

@Component
public class SampleListener {

    public SampleListener(ApplicationArguments arguments){
        System.out.println("foo: " + arguments.containsOption("foo"));
        System.out.println("bar: " + arguments.containsOption("bar"));
    }
}

-> 빈에 생성자가 한 개이고, 그 생성자의 파라미터가 빈일 경우에는 그 빈을 스프링이 알아서 주입해줌

 

 

< 결과 >

foo: false
bar: true

-> VM option은 ApplicationArgument 가 아님

 

 

 

5. 애플리케이션 실행 후 뭔가 추가적으로 실행하고 싶을 때

  • ApplicationRunner (추천) 또는 CommandLineRunner
  • 순서 지정 가능 @Order
@Component
public class SampleListener implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("foo: " + args.containsOption("foo"));
        System.out.println("bar: " + args.containsOption("bar"));
    }
}
@Component
public class SampleListener implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        Arrays.stream(args).forEach(System.out::println);

    }
}

 

반응형
반응형

 

1. 커스터마이징


@SpringBootApplication
public class Application {

	public static void main(String[] args) {

		SpringApplication.run(Application.class, args);

	}

}

-> 이렇게 쓰는 것보다

 


@SpringBootApplication
public class Application {

	public static void main(String[] args) {
    
		SpringApplication app = new SpringApplication(Application.class);
		app.run(args);

	}

}

-> 이렇게 쓰는 게 커스터마이징하기 좋음

 

 

 

2. 디버그 모드

 

 

-> VM options에 -Ddebug

OR

-> Program arguments에 --debug

 

라고 적으면 디버그 모드 실행

: 로그에 디버그 레벨까지 찍힘

: 어떤 자동설정이 들어갔는지 찍힘, 어떠한 자동설정이 왜 안 찍혔는지 알려줌

 

 

 

3. 배너 넣기 & 커스터마이징

resources 폴더 아래 'banner.txt'라는 파일 생성

-> 원하는 배너 작성

-> 실행 시, 작성한 배너가 찍혀 나옴

gif, jpg, png 같은 이미지 파일도 가능

 

 

공식 문서 4.1.3 Customizing the Banner

docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#deployment

 

Spring Boot Reference Documentation

This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly spe

docs.spring.io

-> 일부는 manifest가 생성된 상태에서만 나타남

 

 

 

 

 

4. mvn package (패키징)

jars 파일 하나에 모든 것을 담아줌 -> jar 파일 하나만 실행시키면 됨

 

-> manifest 파일을 만들어줌 -> java -jar target/spring-application-0.0.1-SNAPSHOT.jar

 

 

 

 

5. 코딩으로 배너 구현

@SpringBootApplication
public class Application {

	public static void main(String[] args) {

		SpringApplication app = new SpringApplication(Application.class);
		app.setBanner(new Banner() {
			@Override
			public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
				out.println("--------------------------");
				out.println("실행시이이이이작");
				out.println("--------------------------");

			}
		});
		app.run(args);
	}
}
@SpringBootApplication
public class Application {

	public static void main(String[] args) {

		new SpringApplicationBuilder()
				.sources(Application.class)
				.banner(new Banner() {
					@Override
					public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
						out.println("++++++++++++++++++++++");
						out.println("++++++++++++++++++++++");
						out.println("++++++++++++++++++++++");

					}
				})
				.run(args);
	}
}

 

But, banner.txt 파일과 코딩 둘 다 있다면 banner.txt 파일이 이김

 

 

 

6. 코딩으로 배너 끄기

@SpringBootApplication
public class Application {

	public static void main(String[] args) {

		SpringApplication app = new SpringApplication(Application.class);
		app.setBannerMode(Banner.Mode.OFF);
		app.run(args);
	}
}

 

 

반응형
반응형

1. 테이블 스키마란?

: 테이블을 정의하기 위해 만들어진 데이터 구조

ex) 신입생(학번, 주민등록번호, 이름 주소, 나이, 학과명)

 

- 차수(degree)

: 테이블 스키마에 정의된 필드(=열=속성)의 수

 

 

 

 

2. 테이블 인스턴스란?

: 테이블 스키마에 현실 세계의 데이터를 레코드 형태로 저장한 형태(집합)

 

- 기수(cardinality)

: 테이블 인스턴스에 속한 레코드(=행=튜플)의 수

 

신입생 테이블의 인스턴스

 

 

 

 

3. 테이블의 특성

1) 중복된 레코드 존재 X

: 테이블 인스턴스는 레코드들의 집합이기 때문에

2) 레코드 간의 순서는 의미 X

: 테이블 인스턴스는 레코드들의 집합이기 때문에

3) 레코드 내에서 필드의 순서는 의미 X

: 테이블 스키마는 필드들의 집합이기 때문에

4) 모든 필드는 원자값을 가짐

 

다만, 위의 특징들은 관계형 데이터모델에서 정의되는 테이블(릴레이션)의 논리적 특징이며, 

실제 데이터베이스 시스템에서의 물리적인 특성은 아님

 

-> oracle, mysql 등에서는 물리적으로 순서가 있을 수 있음

 

반응형
반응형

1. 릴레이션

: 두 개 이상의 집합이 주어질 때 각 집합을 구성하는 원소들의 순서쌍에 대한 집합

-> 테이블을 릴레이션이라고 함

릴레이션 예시

 

 

 

2. 릴레이션의 개념

 

1) 속성(attribute) = 필드(field) = 열(column)

 

2) 튜플(tuple) = 레코드(record) = 행(row)

 

3) 도메인(domain)

: 각 필드에 입력 가능한 값들의 범위, 즉 각 필드가 가질 수 있는 모든 값들의 집합

- 원자값, 즉 더 이상 분리되지 않는 값이어야 함

ex) 이름, 전화번호, 주소, 생일

 

4) 널(NULL)

: 특정 필드에 대한 값을 알지 못하거나, 아직 정해지지 않아 입력하지 못한 경우

- 0이나 공백 문자와는 다름

 

릴레이션의 개념

 

반응형

+ Recent posts