728x90

 

 

JPA란

  • JAVA Persistance API 의 줄임말로 자바 프로그램에서 관계형 데이터베이스에 접근하는 방식을 명세화한 인터페이스
  • JPA는 자바애플리케이션과 JDBC에서 작동하며 구현체는 Hibernate 라이브러리를 사용
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");
EntityManager em = emf.createEntityManager();

// 엔터티 매니저를 사용하여 영속성 컨텍스트와 상호 작용
// ...

em.close();
emf.close();

애플리케이션 전체의 라이프사이클 동안 하나의 엔터티 매니저 팩토리가 생성되며,

애플리케이션 내의 여러 엔터티 매니저를 생성할 수 있음

 

 

Entity Mapping

@Entity

도메인 객체를 관계형 데이터 베이스 테이블로 맵핑할 때 사용

@Table

테이블옵션 설정가능(name, scheme, catalog)

@Access

데이터 필드 접근 / 프로퍼티 접근 방식(getter, setter) 설정가능

기본키 맵핑

@Id

기본키를 직접할당하는 경우

@GeneratedValue

기본 값을 자동생성

 

 

엔티티 설계

OneToOne

  • 일대일 관계
  • 주 테이블에 외래키 설정
@Entity
public class Person {
    @OneToOne
    private Address address;
    // ...
}

@Entity
public class Address {
    @OneToOne(mappedBy = "address")
    private Person person;
    // ...
}

OneToMany

  • 일대다 관계
  • 외래키 설정
  • 연관관계의 주인 : 외래키가 있는 테이블
  • 반대테이블은 mappedBy 속성을 사용하여 연관된 엔터티의 필드를 지정
@Entity
public class Team {
    @OneToMany(mappedBy = "team")
    private List<Member> members;
    // ...
}

@Entity
public class Member {
    @ManyToOne
    private Team team;
    // ...
}

ManyToOne

  • 다대일 관계
  • @JoinColumn 어노테이션을 사용하여 외래 키를 지정
@Entity
public class Member {
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    // ...
}

@Entity
public class Team {
    // ...
}

ManyToMany

  • 다대다 관계
  • 연관된 엔터티 간의 관계를 표현하는 연결 테이블을 자동으로 생성
  • 실무 사용 X
@Entity
public class Student {
    @ManyToMany
    @JoinTable(
        name = "STUDENT_COURSE",
        joinColumns = @JoinColumn(name = "STUDENT_ID"),
        inverseJoinColumns = @JoinColumn(name = "COURSE_ID")
    )
    private List<Course> courses;
    // ...
}

@Entity
public class Course {
    @ManyToMany(mappedBy = "courses")
    private List<Student> students;
    // ...
}
  • 외래키 설정은 필수 아님

Cascade

부모 엔티티 변경이 자식 엔티티에 자동으로 전파되도록 함

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<>();

 

 

엔티티 설계 - 도메인 모델 패턴

  • 엔티티가 비즈니스 로직 가지고 객체 지향의 특성을 활용 하는 방법
//==생성 메서드==//
    public static OrderItem createOrderItem(Item item, int orderPrice, int count) {
        OrderItem orderItem = new OrderItem();
        orderItem.setItem(item);
        orderItem.setOrderPrice(orderPrice);
        orderItem.setCount(count);

        item.removeStock(count);
        return orderItem;
    }

 

 

엔티티 설계 주의점

  1. 가급적 setter를 사용 X
  • 변경 포인트가 많아 유지보수가 어렵다
  1. 모든 연관관계는 지연로딩으로 설정 (LAZY)
  • 관련된 모든 연관관계를 가져올 수 있음
  • 특히 JPQL을 실행할 때 N + 1 문제가 자주 발생
  • 연관된 엔티티를 함께 DB에서 조회해야하면 fetch join 을 이용
  • x to one → 기본이 EAGER로 되어있음
  1. 컬렉션은 필드에서 초기화, 가급적으로 바꾸지 x

 

 

더티 체킹(dirty checking)

영속성 컨텍스트(persistence context)가 엔티티의 상태 변화를 감지하여 데이터베이스에 자동으로 변경을 반영하는 기능

 

 

Repository 설계

@PersistanceContext 어노테이션으로 EntityManater 변수를 생성

→ 스프링이 영속성 컨텍스트를 주입해 줌

→ 주입된 엔티티는 트랜잭션 커밋될 때 까지 변경되지 않음

 

 

Service 설계

@Transactional

서비스 단에서 트랜잭션을 관리하는 어노테이션 필요

사용하면, 트랜잭션을 시작하고 커밋하거나 롤백하는 코드를 작성할 필요가 없어짐

읽기전용인 경우 @Transactional(readOnly = true) 의 조건을 달아줌 → 성능 최적화됨

repostiory 필드 주입 vs 생성자 주입

필드주입

public class MemberService {
@Autowired
MemberRepository memberRepository;
...
}

생성자 주입

public class MemberService {
	private final MemberRepository memberRepository;
	public MemberService(MemberRepository memberRepository) {
	this.memberRepository = memberRepository;
}
...
}
  • 생성자 주입 방식을 권장
  • 변경 불가능한 안전한 객체 생성 가능
  • 생성자가 하나면, @Autowired 를 생략할 수 있다.
  • final 키워드를 추가하면 컴파일 시점에 memberRepository 를 설정하지 않는 오류를 체크할 수 있다.(보통 기본생성자를 추가할 때 발견)

@RequiredArgsConstructor : 파이널이 있는 필드만 생성자 주입

 

 

Controller

주의사항

api에 엔티티를 전달해서 노출하면 안됨

테스트 작성

ctrl + shift + T를 통해 테스트 클래스 만듬

JUNIT 주입

@RunWith(SpringRunner.class) @SpringBootTest @Transactional(실패시 롤백) 의 어노테이션 적용

given, when , then 방식으로 구현

Autowired로 서비스와 레파지토리 주입

assertequals 를 통한 데이터 검증

@Autowired MemberService memberService;
    @Autowired
    MemberRepository memberRepository;
    @Autowired
    EntityManager em;

    @Test
    @Rollback(false) //쿼리 찍히는 것 보기
    public void 회원가입() throws  Exception{
        //given
        Member member = new Member();
        member.setName("kim");
        //when
        Long savedId = memberService.join(member);

        //then
        em.flush(); //쿼리 나가는 것 보려면
        assertEquals(member, memberRepository.findOne(savedId));
    }
    
    
    //어노테이션으로 예외처리
    @Test(expected = IllegalStateException.class)
    public void 중복회원예외() throws  Exception{
        //given
        Member member1 = new Member();
        member1.setName("kim");

        Member member2 = new Member();
        member2.setName("kim"); //중복 상황
        //when
        memberService.join(member1);
        memberService.join(member2);

        //then
        fail("실패");
    }

 

QueryDSL

동적 쿼리, 조인 및 복잡한 쿼리를 작성할 때 사용하는 프레임 워크

 

 

변경감지와 병합

준영속 엔티티 : 영속성 컨텍스트가 관리하지 않는 객체

직접 new 를 통해 만든 객체는 JPA가 관리하지 않음

  • 변경감지(dirty checking) : em.find()
@Transactional
void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티를 조회한다.
findItem.setPrice(itemParam.getPrice()); //데이터를 수정한다.
}
  • 병합 : em.merge()
@Transactional
void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
Item mergeItem = em.merge(itemParam);
}

변경 감지 기능을 사용하면 원하는 속성만 선택해서 변경할 수 있지만, 병합을 사용하면 모든 속성이 변경된다.

병합시 값이 없으면 null 로 업데이트 할 위험도 있다. (병합은 모든 필드를 교체한다.)

변경감지를 사용하는 것이 좋다

728x90
728x90

리스트

  • 요소를 삭제하거나 변경

 💡 my_list = [요소1, 요소2, 요소3, ...]

 

  • 자주 쓰이는 함수
#append()
my_list = [1, 2, 3]
my_list.append(4)  # 리스트의 끝에 요소를 추가합니다.

#extend()
my_list = [1, 2, 3]
other_list = [4, 5, 6]
my_list.extend(other_list)  # 다른 리스트의 모든 요소를 현재 리스트에 추가합니다.

#insert()
my_list = [1, 2, 3]
my_list.insert(1, 5)  # 지정된 위치에 요소를 삽입합니다.

#remove()
my_list = [1, 2, 3, 4]
my_list.remove(3)  # 첫 번째로 나오는 지정된 값을 삭제합니다.

#pop()
my_list = [1, 2, 3, 4]
popped_element = my_list.pop(1)  # 지정된 인덱스의 요소를 삭제하고 반환합니다.

#index()
my_list = [1, 2, 3, 4]
index = my_list.index(3)  # 지정된 값의 인덱스를 반환합니다.

#count()
my_list = [1, 2, 3, 1, 1]
count = my_list.count(1)  # 지정된 값의 개수를 반환합니다.

#reverse()
my_list = [1, 2, 3, 4]
my_list.reverse()  # 리스트의 순서를 뒤집습니다.

#sort()
my_list = [4, 2, 1, 3]
my_list.sort()  # 리스트를 정렬합니다.

#copy()
my_list = [1, 2, 3]
new_list = my_list.copy()  # 리스트를 복사하여 새로운 리스트 생성합니다.

#min(), max(), sum()

my_list = [3, 1, 5, 2, 4]
min_value = min(my_list)
max_value = max(my_list)
sum_value = sum(my_list)

#len() : 길이반환

 

 

튜플

  • 소괄호 사용하거나 괄호가 없어도 가능
  • 복합할당, 스왑 할 때 많이 사용
  • 딕셔너리의 key로 사용가능
t = (seq)        // 튜플로 변환
t.count           // 요소 개수
t.index(2)        // 요소 위치 index
len.(t)           // 튜플 길이
max.(t)           // 요소 중 최대값
min.(t)           // 요소 중 최소값

a = 1
b = 2

#튜플 이용한 스왑
a, b = b, a

#key로 사용
my_dict = {(1, 2): 'value'}
print(my_dict[(1, 2)])  # 출력 결과: value

 

 

딕셔너리

  • 키(key)와 값(value)의 쌍으로 이루어진 연관 배열
  • 딕셔너리는 중괄호 **{}**를 사용하여 정의하며, 각 쌍은 쉼표로 구분

💡 my_dict = {'apple': 3, 'banana': 5, 'cherry': 2}

 

  • 자주 쓰이는 함수
my_dict = {'apple': 3, 'banana': 5, 'cherry': 2}

my_dict['orange'] = 4  # 새로운 키-값 쌍을 추가합니다.

value = my_dict.get('banana', 0)  # 지정된 키에 해당하는 값을 반환하고, 키가 없으면 기본값을 반환합니다.

if 'apple' in my_dict:  # 딕셔너리에 특정 키가 있는지 확인합니다.
    print("딕셔너리에 'apple' 키가 있습니다.")

keys = my_dict.keys()  # 딕셔너리의 모든 키를 반환합니다.

values = my_dict.values()  # 딕셔너리의 모든 값들을 반환합니다.

items = my_dict.items()  # 딕셔너리의 모든 키-값 쌍을 반환합니다.

del my_dict['banana']  # 지정된 키-값 쌍을 삭제합니다.

 

 

 

SET

  • 요소의 중복이 불가능한 내장모듈 collection 자료형
  • 가변성을 가짐
#중복제거 예시
my_list = [1, 2, 3, 1, 2, 4, 5]
my_set = set(my_list)
print(my_set)

{1, 2, 3, 4, 5}

  • 집합 연산 수행이 가능함
# 집합 연산 예제

# 교집합(intersection)
set1 = {1, 2, 3, 4, 5}
set2 = {3, 4, 5, 6, 7}

intersection_set = set1 & set2
# 또는
intersection_set = set1.intersection(set2)

print("교집합:", intersection_set)  # 출력 결과: {3, 4, 5}

# 합집합(union)
set3 = {5, 6, 7, 8, 9}

union_set = set1 | set3
# 또는
union_set = set1.union(set3)

print("합집합:", union_set)  # 출력 결과: {1, 2, 3, 4, 5, 6, 7, 8, 9}

# 차집합(difference)
difference_set = set1 - set2
# 또는
difference_set = set1.difference(set2)

print("차집합:", difference_set)  # 출력 결과: {1, 2}

728x90
728x90

변수

  • 네이밍 : 파이썬에서는 보통 snake case 스타일로 변수 네이밍
  • 동적 타입 시스템을 가진 언어로 데이터 타입 명시할 필요가 없다

 

format()

대부분 f 문자열을 많이 사용하지만 두 가지 상황에서는 format 함수를 사용

  1. 문자열 내용이 너무 많을 때
  2. 데이터를 리스트에 담아서 사용할 때

기본형태

#기본 형태
name = 'BlockDMask'
age = 55

# 인덱스를 지정하지 않고 변수를 대입하는 예제
s1 = 'name : {}'.format(name)
s2 = 'age : {}'.format(age)

print(s1)  # 출력 결과: name : BlockDMask
print(s2)  # 출력 결과: age : 55

#괄호 안에 인덱스를 지정
s1 = 'name : {0}'.format('BlockDMask')
print(s1)  # 출력 결과: name : BlockDMask

 

 

f 문자열

문자열 안의 값을 format 함수보다 간단하게 삽입할 수 있음

<aside> 💡 f'문자열 {변수나 표현식}'

</aside>

name = "John"
age = 30

s = f'이름: {name}, 나이: {age}'
print(s)

 

 

형식 지정자

  1. %s: 문자열(string)
  2. %d: 정수(integer)
  3. %f: 부동 소수점 실수(float)
  4. %c: 정수를 해당하는 문자(character)로 변환
  5. %r: 객체의 repr() 문자열로 표현
  6. %%: '%' 문자 자체를 출력
name = "John"
age = 30
s = '이름: %s, 나이: %d' % (name, age)
print(s)

 

 

조건문

if 조건1:
    # 조건1이 참일 때 실행할 코드
elif 조건2:
    # 조건2가 참일 때 실행할 코드
else:
    # 모든 조건이 거짓일 때 실행할 코드

 

 

Range

  • 정수의 범위를 나타냄
  • range (0, 5) 인 경우 5번째는 포함하지 않음 -1

💡 range(start, stop, step)

 

for i in range(5):
    print(i)

 

 

반복문

  • for 반복문

💡 for 요소 in iterable:

 

fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)

#break(조건문을 나감) , continue(현재 반복을 생략 하고 다음 반복으로)와 함께 사용 가능

  • while 반복문

 

728x90
728x90

시작이 반인데....jpa 프로젝트 설정부터 에러가 발생해버렸다 참고로 무료버전을 사용중

해결방법이 생각보다 간단해서 다행..!

 

에러메시지


Execution failed for task ':JpashopApplication.main()'. > Process 'command 'C:\Program Files\Java\jdk-17\bin\java.exe'' finished with non-zero exit value 1 * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org.

 

해결방법

 

File > Settings 메뉴 클릭 (윈도우 Ctrl + Alt + S)

  1. [Build and run using]과 [Run tests using]을 IntelliJ IDEA로 변경
  2. [Gradle JVM] 버전을 현재 프로젝트 버전과 동일한 버전으로 변경

 

 

빌드 후 정상 동작되었다

반가운 sping 모양이 나왔다 ..!!

 

728x90
728x90

📌 서버: 
1.클라이언트에서 호출된 메서드를 실행
2. sqlconnection 으로 데이터베이스에 연결
-> 쿼리에 매개변수를 채워 해당 값으로 실행시긴다
3. SqlDataAdapter를 이용하여 쿼리 결과를 Dataset에 채움
4. Dataset 결과를 Repeater컨트롤에 바인딩 하여 결과를 제공
5. Repeater이 채워진 데이터와 함께 랜더링된 HTML 이 클라이언트에 전송됨



📌 특징
서버사이드 랜더링 
1. 서버에서 페이지를 렌더링하고 클라이언트에게 완성된 HTML 문서를 전송
2. 이미 생성된 데이터를 서버에 랜더링하는 방식
-> 랜더링 속도가 빠름

📌 사용태그
태그(<tag>)에 runat="server"만 붙여주면 해당 태그에 맞는 HtmlControl(서버컨트롤)로 변신하게 됨.

 


📌 사용클래스
1. Page 클래스:
System.Web.UI.Page 클래스는 웹폼의 기본 클래스로, 웹 페이지의 라이프사이클 및 이벤트 처리에 사용


IsPostBack : 페이지가 처음 로드됬는 지 확인하는 것으로 페이지 처음로드 or 이벤트 처리를 분리할 수 있다


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MyWebForhttp://m.aspx.cs" Inherits="YourNamespace.MyWebForm" %>

페이지 지시문 : 클라이언트에 지시문을 사용 

Language는 페이지의 스크립트 언어를 지정하며, 

AutoEventWireup은 이벤트 처리 메서드를 자동으로 연결할지 여부를 나타냅니다. 

CodeBehind 및 Inherits는 코드 파일과 연결된 페이지 클래스를 지정

참고 : https://m.blog.naver.com/islove8587/221890430792

2. Server 클래스:


Server.MapPath : 실제 파일경로를 맵핑
Server.Execute /Server.TransferRequest

 



📌 빌드 시 수행되는 액션
코드 작성 -> 컴파일(고급 언어로 변환) -> 어셈블리 생성(고급언어를 포함한 응용프로그램 형태) -> 배포 프로그램에 포함됨 -> 플랫폼에 맞게 실행


런타임 내부 이해하기
https://m.blog.naver.com/islove8587/221890564826

728x90

'C# asp.net' 카테고리의 다른 글

C# DB 연결관련 메소드 정리  (0) 2023.08.01
C# JsonResult, ActionResult  (0) 2023.06.26
C# Newtonsoft.Json, JObject  (0) 2023.06.26
C# namespace, using 사용법  (0) 2023.06.19
C# : Database 연동(SqlClient 사용)  (0) 2022.04.21
728x90

Collections framework

컬렉션을 다루기 위한 표준화된 프로그래밍 방식

컬렉션이란 ?

-여러 객체(데이터) 를 모아 놓은 것을 의미

 

프레임워크 계층도

자바의 컬렉션 프레임워크는 java.util 패키지에 인터페이스와 추상 클래스로 구성된 복잡한 계층으로 되어 있다. 빈번히 사용되는 클래스 위주로 정리해 보면 다음과 같다

 

컬렉션 프레임웍의 핵심 인터페이스

 

1. List

순서(저장순서) 가 있는 데이터의 집합. 데이터의 중복을 허용한다

  • LinkedList
    - 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 되기에 유용
    - 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰임
  • Vector
    - 과거에 대용량 처리를 위해 사용했으며, 내부에서 자동으로 동기화처리가 일어나 비교적 성능이 좋지 않고 무거워 잘 쓰이지 않음
  • ArrayList
    - 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회 기능에 성능이 뛰어남

 

2. Set

순서를 유지하지 않는 데이터의 집합. 데이터의 중복을 허용하지 않는다 > 집합의 성질

  • HashSet
    - 가장빠른 임의 접근 속도
    - 순서를 예측할 수 없음
  • TreeSet
    - 정렬방법을 지정할 수 있음

 

3. Map

키와 값 쌍으로 이로어진 데이터의 집합

순서는 유지되지 않으며, 키는 중복을 허용하지 않고 값은 중복을 허용한다

  • Hashtable
    - HashMap보다는 느리지만 동기화 지원
    - null불가
  • HashMap
    - 중복과 순서가 허용되지 않으며 null값이 올 수 있다.
  • TreeMap
    - 정렬된 순서대로 키(Key)와 값(Value)을 저장하여 검색이 빠름

 

인터페이스 메서드 : 추가 / 삭제/ 검색이 가능하다

728x90

'JAVA' 카테고리의 다른 글

JAVA : substring 문자열 자르기  (0) 2023.08.16
JAVA : charAt() 사용법  (0) 2023.08.16
JAVA : 객체 지향 언어의 특징 & 장점, 단점  (0) 2023.05.26
JAVA : try catch 예외처리  (0) 2022.05.12
JAVA : 클래스, 클래스 구성요소  (0) 2021.07.09
728x90

[프로그래머스, LV.0] 수 조작하기 1, 수 조작하기 2 풀이

 

https://school.programmers.co.kr/learn/courses/30/lessons/181925

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명


정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다.

"w" : 수에 1을 더한다.
"s" : 수에 1을 뺀다.
"d" : 수에 10을 더한다.
"a" : 수에 10을 뺀다.
그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다.

주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.

 

 

제한사항


2 ≤ numLog의 길이 ≤ 100,000
-100,000 ≤ numLog[0] ≤ 100,000
1 ≤ i ≤ numLog의 길이인 모든 i에 대해 |numLog[i] - numLog[i - 1]|의 값은 1 또는 10입니다.

입출력 예
numLog                                      result
[0, 1, 0, 10, 0, 1, 0, 10, 0, -1, -2, -1] "wsdawsdassw"

입출력 예 설명
입출력 예 #1

result인 "wsdawsdassw"를 따라 numLog[0]에서부터 시작해 조작을 하면 numLog의 값과 순서대로 일치합니다. 따라서 "wsdawsdassw"를 return 합니다.

 

 

풀이

 

class Solution {
    public String solution(int[] numLog) {
        String answer = "";
        StringBuilder sb = new StringBuilder();
        
        for(int i =0 ; i < numLog.length - 1; i ++ ){
           
            int diff = numLog[i + 1] - numLog[i];
            
            if(diff == 1){
                sb.append('w');
            }
            else if(diff == - 1){
                sb.append('s');
            }
            else if(diff ==  10){
                sb.append('d');
            }
            else if(diff == - 10){
                sb.append('a');
            }
        }
        
        return sb.toString();
    }
}
  • 배열 마지막 값을 비교하기 위해 i=0 부터 시작해서 length - 1 까지 for 루프를 수행하도록 함
  • 굳이 StringBuilder를 안쓰고 answer에 값을 더해도 될 것 같다
728x90
728x90

substring  

문자열을 자르기 위해서 사용되는 함수이다

 

substring  문법

2가지 방식으로 인자값을 받고 있으며 사용법은 아래와 같다

String substring(int startIndex); 시작인덱스 값 입력
String substring(int startIndex, int endIndex); 시작과 끝 입력

 

예시

첫번째는 bd

두번째는 efgggg 가 출력된다

 

인덱스 시작이 0이라는 것에 주의해야한다

728x90
728x90

charAt이란 

string 타입으로 받은 문자열을 char 타입으로 한 글자만 받는 함수로 Scanner와 같이 응용되서 사용이 됩니다

 

형식

문자열.charAt(인덱스) 

 

 

예제

 

 

length()와 함께 for문에서 활용하는 예제

 

 

728x90
728x90

사이드 프로젝트 진행하면서 오라클 db를 사용중인데

인덱스 만드는 문법이 업무에서 사용하는 mssql 과 다를까하여 검색해보았는데 거의 비슷한 것 같지만 정리해보았다.......!

 

 

시퀀스 생성

시퀀스를 사용하여 자동 증가 값을 생성하면 데이터를 삽입할 때 마다 자동으로 증가를 시켜준다.

예약테이블의 고유한 예약번호처럼 시퀀스를 활용할 예정이므로 테이블 인덱스에 시퀀스값을 주었다.

시퀀스 이름은 데이터베이스 내 고유해야한다 -> 동일 스키마내에서는 중복 이름을 사용할 수 없다

 

시퀀스로 인덱스 생성

 

그 외 인덱스 사용법

고유 인덱스

기타

728x90

+ Recent posts