반응형

1. 집합 연산의 종류

합집합 / 차집합 / 교집합 / 카티션 프로덕트 

 

 

 

2. 합집합

 

 

3. 교집합

 

 

 

 

4. 차집합

 

 

 

 

5. 카티션 프로덕트

: 두 개의 테이블에서 각각의 레코드들을 서로 결합하여 하나의 레코드로 구성하면서 가능한 모든 조합의 레코드를 생성

 

 

 

- 교환법칙과 결합법칙이 성립

 

 

 

 

6. 조인

: 두 테이블로부터 특정 조건을 만족하는 레코드들을 하나의 레코드로 결합하는 연산

 

 

 

 

7. 자연 조인

: 두 테이블에서 같은 이름을 갖는 필드 중 하나를 제거하는 연산

-> 이 때 두 필드에서 모두 존재하는 레코드만 가져온다.

 

 

 

 

8. 외부 조인

: 자연 조인에서 두 필드에 모두 존재하지 않더라도 가져올 수 있게 한다.

: 매치되지 않는 레코드는 NULL값 처리

freshman : (name, address)

member : (name, dept_name)

-> 펼쳐져 있는 쪽의 데이터를 가져옴

 

 

 

 

9. 지정 연산

: 중간 결과에 이름을 부여하기 위한 연산

- 재명명 연산이랑 비슷

 

 

반응형
반응형

1. 관계형 데이터베이스란? (RDBMS)

: 하나 이상의 2차원 테이블로 실 세계의 데이터를 표현한 데이터베이스

: SQL 을 사용하여 데이터를 저장, 검색, 수정, 삭제한다.

 

 

* nosql 은?

: 관계형 데이터베이스의 반대로 데이터 간의 관계를 정의하지 않는다. (스키마가 없다)

 

 

- 데이터베이스 스키마 = 테이블 스키마의 집합

데이터베이스 스키마 예제

 

 

- 데이터베이스 인스턴스 = 테이블 인스턴스의 집합

 

데이터베이스 인스턴스

 

 

 

2. 질의어

: 데이터를 삽입, 삭제, 수정, 검색(CRUD) 등 데이터 조작을 위한 연산들을 표현하기 위한 언어

 

- 절차적 언어

: 사용자가 원하는 결과를 얻기 위해 수행되어야 하는 일련의 절차를 명시해야 하는 언어

ex) C, Java, 관계 대수

 

- 비절차적 언어

: 수행 절차는 기술하지 않고 사용자가 원하는 결과만을 형식적, 선언적으로 명시하는 언어

ex) 관계 해석, SQL

 

 

 

 

 

 

* 관계 대수와 관계 해석은 SQL 문법의 이론적 기반을 제공한다.

 

3. 관계대수

 

- 연산 종류

기본 연산 : 선택, 추출, 재명명, 집합 연산(합, 차, 교, cartesian product)

추가 연산 : 조인, 자연조인, 외부조인, 지정연산, 나누기연산

 

 

주의 !!

관계 대수의 결과는 중복을 제거함

다만, Oracle 등 실제 DBMS에서는 대부분 허용함

 

 

 

 

4. 선택(selection)

- 시그마 할 때 's' -> selection

- 조건식 : <, >, <=, >=, <> 와 and(^), or(v), not(기역..) 의 조합

- AND 할 때 A 의 뾰족한 부분이 ^와 닮음

 

만약, 해당 필드의 값이 Null 일 경우?

값을 알지 못하기 때문에 검색 결과에서 배제

 

 

 

예시 1>

 

예시 2>

 

 

 

 

 

5. 추출(projection)

- 파이 할 때 P -> Projection

- 추출하고자 하는 테이블의 필드를 작성

 

 

 

 

ex>

 

 

 

 

6. 연산자들의 조합

 

 

 

 

- 선택 연산은 교환법칙 성립 O

- 추출 연산은 교환법칙 성립 X : 첫 번째 필드가 두 번째 필드를 포함하면 교화법칙 성립

 

 

 

 

7. 재명명 연산(rename)

: 로우 니까 R 이니까 rename

 

 

- 주의

본래 데이터베이스에 저장된 테이블명/필드명이 변경되는 것은 아님

 

 

 

글이 너무 길어지는 관계로

집합은 다음 글에서 설명하도록 하겠습니다.

반응형
반응형

로깅? 로그 찍기

 

 

1. 로킹 퍼사드 vs 로깅

 

로깅 퍼사드

: Commons Logging, SLF4j

: 로거 api를 추상화해 놓은 인터페이스

: 로거를 바꿔 끼울 수 있게 해줌

 

로깅

: JUL, Log4j2, Logback

 

스프링 프레임워크는 Commons Logging, Logback을 사용함

 

 

 

2. Spring-JCL

스프링 5부터 추가된 기능

Commons Logging -> SLF4j 로 보내도록 함

- pom.xml 에 exclusion 안해도됨

 

 

 

3. 더 자세한 로그를 찍고 싶다면?

-> program argument 에 --debug 로 설정(일부 핵심라이브러리만 디버깅 모드로)

-> program argument 에 --trace 로 설정(전부 다 디버깅 모드로)

 

 

 

4. 디버깅 컬러로 찍기

spring.output.ansi.enabled=always

appliction.properties

 

 

5. 파일 출력

logging.path=logs

appliction.properties

 

 

6. 로그 레벨 조정

logging.level.com.example.springapplication=DEBUG

appliction.properties

 

-> 자신의 파일 경로를 설정해주기

 

@Component
public class SampleRunner implements ApplicationRunner {

    private Logger logger = LoggerFactory.getLogger(SampleRunner.class);

    @Autowired
    private String hello;

    @Autowired
    private NaeunProperties naeunProperties;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        logger.info("=====================");
        logger.info(hello);
        logger.info(naeunProperties.getName());
        logger.info(naeunProperties.getFullName());
        logger.info("=====================");
    }
}

SampleRunner.java

 

결과 로그

 

 

7. 커스텀 로그 설정 파일 이용하기

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
    <logger name="com.example.springapplication" level="DEBUG"/>
</configuration>

logback-spring.xml

 

-> logger name 에 경로 설정해주기

 

 

 

8. 로거를 log4j2 로 변경하기

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<version>2.3.4.RELEASE</version>
	<exclusions>
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

pom.xml

반응형
반응형

1. Profile의 활용 방법

@Profile("prod")
@Configuration
public class BaseConfiguration {

    @Bean
    public String hello(){
        return "hello";
    }
}

-> prod 라는 profile 일 때만 빈을 사용가능함

 

 

 

@Component
public class SampleRunner implements ApplicationRunner {

    @Autowired
    private String hello;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("====================");
        System.out.println(hello);
        System.out.println("====================");
    }

}

SampleRunner.java

 

-> profile 설정이 없기 때문에 오류가 난다

 

 

 

2. 어떤 profile을 활성화시킬 것인가?

spring.profiles.active = prod

-> application.properties에 이렇게 설정해주면 실행 가능

 

 

 

java -jar target/spring-application-0.0.1-SNAPSHOT.jar --spring.profiles.active=test

[ terminal ]

 

-> 커맨드라인 아규먼트가 application.properties 보다 우선순위가 높기 때문에 test 가 실행된다.

 

 

 

 

3. 어떤 profile을 추가할 것인가? 프로파일용 프로퍼티

spring.profiles.include=proddb

application.properties

 

 

- application-proddb.properties 라는 파일 만들어서 

naeun.fullName=dbdbdb 으로 설정해주면 profile이 추가가 됨

 

 

 

 

4. 매번 패키징하기 귀찮을 때 

 

 

-> Program arguments 에 --spring.profiles.active=prod 라고 설정해주고 IDE에서 실행시킴

반응형
반응형

1. 타입 세이프 프로퍼티 @ConfigurationProperties

- 여러 프로퍼티들을 묶어서 읽어올 수 있음

- @AutoWired 로 간단하게 가져올 수 있음

- @Value 보다는 @ConfigurationProperties 로 쓰는게 나음

 

package com.example.springapplication;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties("naeun")
public class NaeunProperties {
    String name;
    int age;
    String fullName;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }
}

NaeunProperties.java

 

-> 새로운 파일 생성

-> @Component로 빈으로 등록해주기

-> @ConfigurationProperties 로 이름붙여주기?

 

 

@Component
public class SampleRunner implements ApplicationRunner {

    @Autowired
    NaeunProperties naeunProperties;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("====================");
        System.out.println(naeunProperties.getName());
        System.out.println(naeunProperties.getAge());
        System.out.println("====================");
    }

}

SampleRunner.java

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-configuration-processor</artifactId>
		<optional>true</optional>
</dependency>

의존성 추가

 

-> 메타정보를 생성해주는 의존성 추가, 자동완성 사용가능

 

 

 

 

2. 프로퍼티 타입 컨버젼

 

application.properties 에 적은 문자열이

int형으로 선언하면 int 형으로 자동으로 타입이 바뀜

 

application.properties 에 적은 문자열이

Duration형으로 선언하면 Duration 형으로 자동으로 타입이 바뀜

 

 

 

3. 검증

@Component
@ConfigurationProperties("naeun")
@Validated
public class NaeunProperties {

    @NotEmpty
    String name;
    int age;
    String fullName;

    @DurationUnit(ChronoUnit.SECONDS)
    private Duration sessionTimeout = Duration.ofSeconds(30);

    public Duration getSessionTimeout() {
        return sessionTimeout;
    }

    public void setSessionTimeout(Duration sessionTimeout) {
        this.sessionTimeout = sessionTimeout;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }
}

-> @Validated, @NotEmpty 사용해서 값이 없으면 오류가 나게 함

 

 

 

반응형
반응형

 

 

[ 프로퍼티 우선순위 ]

 

  1. 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties
  2. 테스트에 있는 @TestPropertySource
  3. @SpringBootTest 애노테이션의 properties 애트리뷰트
  4. 커맨드 라인 아규먼트
  5. SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로티) 에 들어있는 프로퍼티
  6. ServletConfig 파라미터
  7. ServletContext 파라미터
  8. java:comp/env JNDI 애트리뷰트
  9. System.getProperties() 자바 시스템 프로퍼티
  10. OS 환경 변수
  11. RandomValuePropertySource
  12. JAR 밖에 있는 특정 프로파일용 application properties
  13. JAR 안에 있는 특정 프로파일용 application properties
  14. JAR 밖에 있는 application properties
  15. JAR 안에 있는 application properties
  16. @PropertySource
  17. 기본 프로퍼티 (SpringApplication.setDefaultProperties)

-> 높은게 낮은걸 오버라이딩 함

 

 

 

 

[ application.properties 파일 우선 순위 (높은게 낮은걸 덮어 씁니다.) ]

 

  1. file:./config/
  2. file:./
  3. classpath:/config/
  4. classpath:/

 

 

 

[ 15번 우선순위 - JAR 안에 있는 application properties ]

naeun.name = naeun

application.properties

 

@Component
public class SampleRunner implements ApplicationRunner {

    @Value("${naeun.name}")
    private String name;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("====================");
        System.out.println(name);
        System.out.println("====================");
    }

}

SampleRunner.java

 

 

 

 

 

 

 

 

[ 4번 우선순위 - 커맨드라인 아규먼트 ]

mvn clean package 

mvn package 

java -jar target/spring-application-0.0.1-SNAPSHOT.jar --naeun.name=keesun

터미널

 

 

-> keesun으로 변경되어 찍힘

 

 

 

 

 

 

 

 [ test 파일 안의 application.properties ]

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

	@Autowired
	Environment environment;
	// 스프링에 있는 Environment import 하

	@Test
	void contextLoads() {
		assertThat(environment.getProperty("naeun.name"))
				.isEqualTo("whiteship");
	}

}

ApplicationTests

 

naeun.name = whiteship

test 파일 안의 application.properties

 

-> whiteship 이라고 찍힘

 

 

 

 

 

[ 2, 3번 우선순위 - 테스트에 있는 @TestPropertySource, @SpringBootTest 애노테이션의 properties 애트리뷰트 ]

@TestPropertySource(properties = "naeun.name=keesun3")
@SpringBootTest(properties = "naeun.name=keesun2")

 

 

 

* 너무 관리하기 힘들면 test.properties 라는 다른 이름의 프로퍼티스 생성해서 관리하면됨

 

 

 

[ random value 사용하기 ]

naeun.age = ${random.int}

 

 

 

[ 궁금한 점 ]

AssertThat 이 뭔지?

test 는 왜 있는지?

classpath 가 src?

 

반응형

+ Recent posts