탐욕 알고리즘(Greedy Algorithm)이란 ?

- 최적해를 구하는데 사용되는 방법
- 여러 경우 중 하나를 선택해야 할 때마다 그 순간에 최적이라고 생각되는 것을 선택해 나가는 방식으로 진행하며 각 선택의 시점에서 이루어지는 결정은    지역적으로는 최적이지만 그것들을 계속 진행하였을 때 나온 해답이 최적이라는 보장은 없음.


예를 들어, 거스름 돈 830원을 받아야 하는데 동전의 개수를 가장 적게 받고 싶다면 당연히 500원 짜리로 받을 수 있는 만큼 많이 받고, 그 다음 100원으로 받을 수 있는 만큼 받아야 동전의 개수가 가장 적어질 것이라 생각할 것이다. 이 문제의 경우 실제로 그렇겠지만 말이다.


또는 이전의 완전 검색(Exhaustive Search) 방식에서 보았던 Baby-gin 문제를 Greedy Algorithm 방식으로 문제에 접근한다고 가정해보자.


" Baby-gin은 어차피 앞의 숫자 3개, 뒤의 숫자 3개만 검사하니까 숫자를 정렬한 후 앞,뒤 숫자3개만 run 또는 triple인지 비교하도록 해보자" 


이렇게 접근했을 때 과연 최적의 해답을 구할 수 있을까? "{ 6, 4, 4, 5, 4, 4 }" 라는 숫자를 정렬하면 "{ 4, 4, 4, 4, 5, 6 }" 로 Baby-gin에 해당된다. 그러나

" { 1, 2, 3, 1, 2, 3} 은 이대로 두면 Baby-gin에 해당되지만 정렬하면 { 1, 1, 2, 2, 3, 3} 으로 Baby-gin에 해당하지 않는다.


즉, Greedy Algorithm 방식의 접근은 최적의 해 또는 해답을 보장하지 않는다는 것이다. 


Baby-gin 문제를 또 다른 Greedy Algorithm 방식으로 구현해보자. 

" 숫자 6개의 개수를 표현하는 배열(numbers)에 담아서 run 또는 triple에 해당되면 확인 후 숫자의 개수를 감소시키자. "는 방향으로 접근하여 구현하였다.




'알고리즘 > SW Expert Academy' 카테고리의 다른 글

검색  (0) 2019.02.09
부분 집합 문제  (0) 2019.02.09
2차원 배열  (0) 2019.02.03
Sort(정렬)에 대해서 (1) - Bubble Sort와 Counting Sort  (0) 2019.01.20
완전 검색을 이용한 Baby-gin  (0) 2019.01.19

완전 검색(Exhaustive Search)이란 ? 

- 쉽게 말하자면 모든 경우의 수를 테스트한 후 해답을 도출하는 방법. Brute-force 혹은 Generate-andTest 기법이라고도 불림. 

- 경우의 수가 적은 경우에 유용함



Baby-gin 게임에 완전검색 적용해보기


Baby-gin 게임이란 ?

- 0~9 숫자 카드에서 임의의 카드 6장을 뽑았을 때 3장의 카드가 연속적인 번호를 갖는 경우를 run 이라하고, 3장의 카드가 동일한 번호를 갖는 경우를 triple 라고 함.
- 6장의 카드는 run, triple로만 이루어져 있어야 Baby-gin임


6개 숫자가 입력되었을 때 Baby-gin 인지 확인하는 프로그램을 작성해보자.

1. 6개의 숫자로 조합할 수 있는 모든 경우의 수를 생성한다
   ex) 0 1 5 9 3 2 가 입력 되었을 때 조합할 수 있는 경우의 수.
        0 1 5 9 2 3
        0 3 9 5 1 2
        ... 

2. 각각의 경우에 대하여 Baby-gin 인지 확인한다. 




Baby-gin 확인하기 프로그램 구현




'알고리즘 > SW Expert Academy' 카테고리의 다른 글

검색  (0) 2019.02.09
부분 집합 문제  (0) 2019.02.09
2차원 배열  (0) 2019.02.03
Sort(정렬)에 대해서 (1) - Bubble Sort와 Counting Sort  (0) 2019.01.20
탐욕 알고리즘(Greedy Algorithm)을 이용한 Baby-gin  (0) 2019.01.20

이번에는 엔티티(Entity) 객체와 엔티티를 다루는 엔티티매니저(EntityManager) 객체에 대해 알아보겠습니다.


엔티티(Entity)

엔티티는 영속성을 가진 객체로 DB 테이블에 보관할 대상입니다. 즉 영속 컨텍스트에 속한 객체를 말합니다. 이러한 엔티티는 특정한 시점에 DB에 영향을 미치는 쿼리를 실행하게 됩니다.


이러한 역할을 하는 엔티티를 설정하는 방법은 2가지가 있는데 하나는 @Entity 애노테이션을 이용하는 것이고 다른 하나는 xml 설정을 이용하는 것입니다. 대부분 애노테이션을 이용하므로 애노테이션을 이용하여 엔티티를 설정하는 방법을 알아보도록 하겠습니다.



엔티티를 설정하기 위한 애노테이션


@Entity 애노테이션

 이전에 JPA에서는 쿼리를 자동으로 생성해준다고 했었습니다. JPA는 클래스 이름을 테이블 이름으로 사용하는데 아래의 Room 엔티티는 기본적으로 Room 테이블과 매핑됩니다.

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



@Table 애노테이션

그렇다면 클래스이름과 테이블의 이름이 다른 경우는 어떻게하면 될까요? @Table 애노테이션을 이용하면 클래스이름과 테이블 이름이 다르더라도 name 속성을 설정하여 테이블의 이름을 지정할 수 있습니다.

@Entity
@Table(name="room_info")
public class Room{
// ...
}



@Id 애노테이션

DB가 레코드를 구분하기 위해 주요키를 사용하는 것처럼 JPA는 엔티티의 @Id 애노테이션을 이용하여 식별자를 지정합니다. @Id 애노테이션을 지정한 필드 값은 엔티티를 식별하기 위한 식별자로 사용됩니다. 예를 들면 아래 코드에서 id = ? 쿼리에서 ? 자리에 @Id 설정한 필드가 사용됩니다.
public Optional findRoom(int roomId) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpastart");
    EntityManager em = emf.createEntityManager();
    try {
        Room room = em.find(Room.class, roomId);  // SELECT ... FROM Room r WHERE id = ? 
        return Optional.ofNullable(room);
    } finally {
        em.close();
    }
}



@Basic 애노테이션

@Id 애노테이션을 제외한 나머지 영속 대상은 @Basic 애노테이션을 사용합니다. 아래의 Room 엔티티는 @Basic 애노테이션이 보이지 않는데 생략된 것으로 로 이해하시면 됩니다.
 
@Entity
@Table(name="room_info")
public class Room {
    @Id
    private String number;
    private String name;
    private String description;
}


@Enumerated 애노테이션

열거타입에 대한 매핑은 @Enumerated 애노테이션을 사용합니다. 

// 호텔 등급 열거형 public enum Grade { STAR1, STAR2, STAR3, STAR4, STAR5 }

//호텔 엔티티
@Entity
public class Hotel {
    @Id
    private String id;
    private String name;
    @Enumerated(EnumType.STRING)
    private Grade grade;
}

Hotel 엔티티를 보면 @Enumerated의 속성으로 EnumType.STRING 으로 지정하고 있습니다. 이 속성은 @Enumerated 애노테이션으로 설정한 열거형을 DB로 저장할 때 어떤 값으로 저장할지 결정합니다. EnumType.STRING으로 저장하는 경우 hotel 테이블에는 grade 필드에 "STAR1, STAR2, STAR3, STAR4, STAR5"란 문자열이 저장될 것이고 EnumType.ORDINAL을 사용하는 경우 grade필드에는 0~4(인덱스)가 저장될 것입니다. 여기서 인덱스0은 STAR1, 인덱스4는 STAR5를 가리킵니다. 열거형의 순서는 바뀔 가능성이 있기때문에 ORDINAL을 사용하는 것보다는 STRING을 사용하는 것이 유지보수에 더 유리할 것으로 보입니다.



@Column 애노테이션

@Column 애노테이션은 프로퍼티의 이름과 테이블의 칼럼 이름이 같다면 생략이 가능하지만, 다를 경우에는 @Column 애노테이션을 지정해줘야 합니다. 
@Entity
@Table(name="room_info")
public class Room {
    @Id
    private String number;
    private String name;
        
    @Column(name="description")
    private String desc;
}


좀 이후에 정리하겠지만 JPA는 INSERT, UPDATE, DELETE의 동작이 보통과 다르기 때문에 예상하지 못하거나 실수를 방지하기 위해 읽기 전용 매핑설정이  가능합니다. 읽기 전용 프로퍼티를 설정하는 방법은 insertable 속성과 updateble 속성을 false로 설정하면 됩니다. 읽기 전용 프로퍼티는 JPA가 자동으로 생성하는 쿼리에서 제외됩니다.

@Entity @Table(name="room_info") public class Room { //... @Column(name="id", insertable=false, updatable=false) private Long dbId; }



아래와 같이 insertable 속성과 updatable 속성을 false로 지정하면 JPA에서 쿼리를 생성할 때 해당 컬럼을 제외하는 것을 확인할 수 있습니다.

entityManager.persist(new Room("R202", "홍길동", "2번룸")); // insert into room_info (description, name, number) values (?, ?, ?);

- insert 제외 예시(id가 쿼리에서제외)

entityManager.getTransaction().begin();
Room room = entityManager.find(Room.class, "R202");
room.changeName("리뉴얼 2번룸"); // name을 바꾸는 메서드.
entityManager.getTransaction().commit(); 
// update room_info set description = ?, name = ? where number = ?;
- update 제외 예시(id가 쿼라에서 제외)



@Access 애노테이션

JPA는 DB에서 읽어온 데이터를 엔티티 객체에 매핑하거나, 엔티티 객체를 DB에 반영할 때 엔티티 클래스의 필드 또는 프로퍼티(get/set 메서드)를 사용합니다. 
 예시의 Room 엔티티를 살펴보면 필드에 @Id, @Column 애노테이션을 사용한 것이 아니라 프로퍼티에 사용하고 있습니다. 이렇게 프로퍼티에 애노테이션을 설정하면 DB에서 값을 읽어와 엔티티 객체에 전달할 때는 set메소드를 이용하고, 엔티티를 DB에 반영할 때는 get메소드를 이용하기 때문에 get/set 메소드를 모두 정의해야 합니다.


@Entity @Table(name="room_info") public class Room { private String number; private String name; private String desc; private Long dbId; @Id public String getNumber() { return number; } // setter.. @Column(name="description") public String getDesc(){ return desc; } // setter.. @Column(name="id", insertable=false, updatable = false) { public String getDbId() { return dbId; } // setter.. }


근데 일부는 필드에 일부는 프로퍼티에 설정해보았는데 각각 필드와 프로퍼티를 이용하여 매핑이 되는 것을 확인했습니다. @Access 애노테이션을 사용하여 접근 방식을 지정해야하는 필요성은 잘 모르겠는데 아마 클래스 단위로 접근 방식을 제어하기 위한 것이 아닌가 싶습니다. 

@Entity
@Table(name="room_info")
@Access(AccessType.PROPERTY) // or @Access(AccessType.FIELD)
public class Room {
    // @Id 만약 애노테이션을 필드에 사용하면 에러가 발생함..
    private String number;
    private String name;
    private String desc;
    private Long dbId;

    @Id
    public String getNumber() {
        return number;
    }
    // setter..
    @Column(name="description") 
    public String getDesc(){
        return desc;
    }
    // setter..
    @Column(name="id", insertable=false, updatable = false) {
    public String getDbId() {
        return dbId;
    }
    // setter..
}



@Transient 애노테이션

필드에 transient 키워드나 @Transient 애노테이션을 사용하면 영속대상에서 제외됩니다.
@Entity
@Table(name="room_info")
public class Room {
    @Id
    private String number;
    //...

    @Transient
    private long timestamp = System.currentTimeMills();
}


@Transient 애노테이션을 사용한 엔티티를 조회하면 아래와 같이 쿼리에서 해당 필드가 제외되는 것을 확인할 수 있습니다.

Room find = em.find(Room.class, room.getNumber());
//Hibernate: select room0_.number as number1_0_0_ from room_info room0_ where room0_.number=?



엔티티매니저(EntityManager)

엔티티매니저는 영속 컨텍스트에 접근하여 엔티티에 대한 DB 작업을 제공합니다. 엔티티 매니저의 메서드에 대해 알아보도록 하겠습니다.
 

find() 메서드

find() 메서드는 영속 컨텍스트에서 엔티티를 검색하고 없을 경우 DB에서 데이터를 찾아 영속 컨텍스트에 저장합니다. 여기서 식별자는 Entity 클래스에서 @Id 애노테이션으로 지정한 값을 사용해야 합니다. 

public find(Class entityClass, Object primaryKey)



persist() 메서드

persist() 메서드는 엔티티를 영속 컨텍스트에 저장 후 INSERT 쿼리를 실행합니다. 보통 커밋시점에 INSERT 쿼리를 실행하는데 바로 실행하는 경우도 있습니다. 이는 식별자 생성 방법에 따라 달라지는데 해당 내용은 이후에 정리하도록 하겠습니다.
public void persist(Object entity)


persist() 메서드는 트랜잭션 범위 내에서 실행해야 합니다. persist() 메서드는 실행시점에 영속 컨텍스트에 엔티티를 저장하고, 트랜잭션을 commit() 하는 시점에 insert 쿼리가 실행되므로 트랜잭션 범위에서 실행하지 않는다면 실제로 DB에 반영되지 않습니다.  

EntityManager entityManager = emf.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
try {
    transaction.begin();
    Hotel hotel = new Hotel("H101","서울호텔","STAR5");
    entityManager.persist(hotel);
    transaction.commit();
} catch(Exception e) {
    transaction.rollback();
    ...
} finally {
    entityManager.close();
}



remove() 메서드

remove() 메서드는 엔티티 클래스를 영속 컨텍스트에서 삭제 후 DELETE 쿼리를 실행합니다
public void remove(Object entity)

 

remove() 메서드 역시 트랜잭션 범위 내에서 실행되어야 하며 트랜잭션이 commit() 하는 시점에 delete 쿼리가 실행됩니다.

EntityManager em = emf.createEntityanager();
EntityTransaction transaction = em.getTransaction();

try {
    transaction.begin();
    
    Room room = em.find(Room.class, "R101");
    if(room != null) {
        em.remove(room);
    }
    transaction.commit();
} catch(Exception e) {
    transaction.rollback();
    ...
} finally {
    em.close();
}



엔티티 수정

엔티티 매니저는 별도의 update 메서드를 제공하지 않습니다. JPA는 트랜잭션 범위에서 엔티티 객체의 상태가 변경되면 이를 트랜잭션 커밋 시점에 반영한다. 이 사실을 모르고 사용하면 매우 위험할 것 같으니 주의가 필요합니다

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
try {
    transaction.begin();
    Room room = em.find(Room.class, "R101");
    if(room != null) {
        room.changeName("카프리");
    }
    transaction.commit();
} catch (Exception e) {
    transaction.rollback();
    //...
} finally {
    em.close();
}




'웹 개발 > JPA 프로그래밍' 카테고리의 다른 글

EntityManager 와 영속 컨텍스트  (0) 2019.03.03
@Embeddable  (0) 2019.02.19
JPA 식별자 생성 방식  (0) 2019.01.29
JPA란  (0) 2018.12.29


실무에서 JPA를 사용하고 있는데 올바르게 사용하고 있는지 확신이 들지않아 최근에 공부를 시작했습니다. "JPA 프로그래밍 입문"이란 책을 읽고 공부하며 제가 이해한 내용을 정리하는 곳이니 참고용으로만 봐주시면 감사할 것 같습니다. 


JPA(Java Persistence API)란 무엇인가? 

JPA란 DB 테이블과 자바 객체 사이의 매핑을 처리해주는 ORM[각주:1]이란 기술의 표준입니다. 따라서 JPA에는 객체와 DB 사이의 매핑을 어떻게 설정하고 어떻게 동작해야하는지 기술하고 있습니다. 즉 자바의 클래스와 DB의 테이블을 매핑하는 기술이란 뜻입니다.


JPA를 살펴보다면 하이버네이트(hibernate)란 말을 많이 접하게 됩니다. 그렇다면 하이버네이트란 무엇일까요?


JPA 프로바이더

하이버네이트란 JPA 프로바이더의 한 종류입니다. JPA 프로바이더는 JPA의 표준을 실제로 구현하고 있습니다. 쉽게 말하자면 JPA는 DB와 자바 객체를 매핑하기 위한 인터페이스(API)를 제공하고 JPA 프로바이더는(하이버네이트) 이 인터페이스를 구현한 것이죠.


JPA 특징

  1. 자바 객체와 DB 테이블 사이의 매핑 설정을 통해 SQL을 생성합니다. 보통 JDBC를 사용하여 개발을 하다보면 코드가 비슷한 형태로 반복되게 됩니다.
    DB커넥션을 구하고, 쿼리를 작성하고, 파라미터를 설정하고 실행한 결과를 자바 객체에 설정합니다.
     여기서 문제점은 테이블의 컬럼명이 추가, 삭제, 변경이 된다면 관련되어 있는 모든 쿼리를 수정해야 할 것인데 JPA는 매핑 설정만 변경하면 됩니다.
    또한 실행한 쿼리를 자바 객체에 설정해줘야하는데 JPA는 자바 객체로 매핑하여 검색할 수 있습니다. 즉 유지보수가 쉽습니다.

  2. 객체를 통해 쿼리를 작성할 수 있는 JPQL(Java Persistence Query Language)를 지원합니다.

  3. JPA는 성능 향상을 위해 지연 로딩이나 즉시 로딩과 같은 몇가지 기법을 제공하는데 이것을 잘 활용하면 SQL을 직접 사용하는 것과 유사한 성능을 얻을 수 있습니다. 하지만 잘못이해하고 사용하는 JPA는 성능을 크게 감소시킬 수 있습니다.

JPA 설정

JPA는 기본적으로 클래스패스에 있는 META-INF/persistence.xml 파일을 설정 파일로 사용합니다. 다음은 일반적인 persistence 파일입니다.

<persistence-unit> 태그의 name은 영속 단위를 설정하고 transaction-type은 JPA가 사용할 트랜잭션을 설정합니다. <class> 태그는 영속 관리할 클래스를 지정하며 <exclude-unlisted-classes>속성을 true로 설정하면 <class>태그에서 설정하지 않은 클래스들은 영속 관리 대상에서 제외됩니다. 




JPA 영속성

앞에서부터  "영속성"이란 반복되고 있는데 영속성이란 무엇일까요? JPA에서는 @Entity 애노테이션을 붙인 클래스를 "엔티티"라고 부릅니다. 엔티티는 다음에 자세히 알아보도록 하겠습니다. 

영속 컨텍스트는 엔티티를 담고있는 집합인데 JPA는 이 영속 컨텍스트에 속한 엔티티를 DB에 반영합니다. 즉 프로그램에서는 엔티티를 영속 컨텍스트에 
속한 엔티티를 검색하거나 삭제 또는 추가, 변경하는 작업을 하면 영속 컨텍스트의 내용이 DB에 반영되는 것이죠.


하지만 프로그램에서는 영속 컨텍스트에 직접 접근할 수 없고 EntityManager를 통해서만 영속 컨텍스트에 접근할 수 있습니다. 






  1. Object-Relational Mapping [본문으로]

'웹 개발 > JPA 프로그래밍' 카테고리의 다른 글

EntityManager 와 영속 컨텍스트  (0) 2019.03.03
@Embeddable  (0) 2019.02.19
JPA 식별자 생성 방식  (0) 2019.01.29
엔티티(Entity)와 엔티티매니저(EntityManager)  (0) 2019.01.01

JSTL

자바서버 페이지 표준 태그 라이브러리(JavaServer Page Standard Tag Library)의 약칭이며, 자바EE 기반의 웹 어플리케이션 개발을 위한 컴포넌트 모음이다. JSTL은 조건문, 반복문, XML 데이터 처리와 같은 일을 처리하기 위해 JSP 태그 라이브러리를 추가하였으며 JSP 페이지내에서 자바코드를 바로 사용하지 않고 표준화된 태그셋을 이용한다.


반복문

<c:forEach>


    인덱스: ${status.count}
    이름: ${item.name}
    나이: ${item.age}


속성값


 항목

설명 

기타 

var 

사용할 변수명

필수 

items 

반복할 리스트

필수 

begin

시작 인덱스 기본0 

 

end 

종료 인덱스 기본은 items크기 -1 

 

step 

반복할 때 이동할 인덱스 개수 

 

varStatus 

반복 상태를 가지고 있는 변수

 

varStatus 값

 항목

리턴

설명

index 

int 

items의 항목을 가리키는 인덱스 번호. 

count

int 

몇번 째 반복인지 가리킴. 시작은 1 

first 

boolean 

첫번 째 반복인지 나타냄 

end 

boolean 

마지막 반복인지 나타냄. 



<c:forTokens>

문자열을 특정 기호로 잘라내어 반복할 수 있는 태그.


    숫자: ${item}


참고: http://fruitdev.tistory.com/132

'웹 개발' 카테고리의 다른 글

부트스트랩(Bootstrap) 이란  (0) 2019.03.11
jsonp  (0) 2017.02.09
OAuth 2.0 ( RFC 6749)  (0) 2017.01.19
JSP 와 Servlet의 한글처리.  (0) 2016.10.06
Apache 와 Tomcat  (0) 2016.07.26

먼저 Parameter와 Arguments의 차이를 알아보자면 Parameter는 함수 선언부에서, Arguments는 함수 호출부에서 사용된다.

var a = 1;
function test(b) {  // Parameter
    b = b+1;
}
test(a);  // Arguments


CallByValue

: Arguments의 값을 복사하여 함수로 전달한다.
var a = 10;
function add(b) {
    b = b + 10;
    console.log(b); // 20
}
add(a); 
console.log(a); // 10

마지막 log에서 10이 출력되는 이유는 무엇일까? 


 그것은 add함수를 호출할 때 a의 값을 "복사"하여 전달하기 때문이다. add함수의 b는 a의 복사된 값이기 때문에 b에 10을 더하더라도 a에게는 영향을 미치지 않기때문에 10이 출력되는 것이다. 


 기본적으로 자바스크립트에서는 함수를 호출할 때 기본형(number, string, boolean, null, undefined)을 Arguments로 사용하면 CallByValue방식으로 함수가 호출된다. 


CallByReference

: Arguments의 참조값을 함수로 전달한다.
var a = { };
function add(b) {
    b.test = 1;
} 
add(a);
console.log(a.test); // 1

add함수를 호출할 때 a의 참조값을 전달하였기 때문에 add함수에서 새로운 프로퍼티를 추가하면 a에도 적용되는 것을 확인해 볼 수 있다. 정확히 말하자면 a의 참조값을 전달하는 것이 아니라 a의 참조값을 복사한 뒤 전달한다. 


var a = {};
function change(b) {
    b = 1;
    console.log(b); // 1
}
change(a);
console.log(a); // {}

위의 예제를 하나씩 분석해보자.


[ 1 ]. a에는 {} 를 가리키는 0x12라는 참조값을 저장하고 있다.

[ 5 ]. change 함수를 호출하는데 a를 전달하는 것이 아니라 a가 저장하고 있는 0x12라는 참조값을 복사하여 arguments로 사용한다.

[ 2~4 ]. a의 참조값을 복사한값을 저장하는 새로운 변수 b에는 b=1를 실행하기 이전에는 a와 b모두 {} 를 가리키고 있다. 하지만 b = 1을 실행하면서 b에는 1을 가리키는 참조값 0x13이 저장된다.

[ 6 ]. 즉, change 함수에서는 0x12를 1로 가리키도록 바꾼 것이 아니라, b라는 변수에 1을 가리키는 참조값을 저장한 것이다. 따라서 a에는 변화가 없다.


자바 기본서나 여러책에서도 위와 같은 내용이 많이 나오니 참고바란다.












'웹 개발 > 자바스크립트' 카테고리의 다른 글

정규식 (작성중)  (0) 2018.04.25

정규식이란 특정한 규칙을 가지는 문자열을 표현하는 언어이다. 


정규표현식이라는 문구는 문자열이 준수해야하는 패턴을 표현하기위한 텍스트 표현식이다. 정규표현식의 각 문자는 메타문자(특별한 의미로 해석되는 문자)와 정규 문자(리터럴 문자)로 구성된다. 


아래는 간단한 정규표현식 예시이다.

    // 문자열에서 "abc"와 패턴이 일치하는지 검사하는 정규표현식.
    var regex = /abc/;
    regex.test("abc");// true
    regex.test("abcd");// true
    regex.test("abd");//  false

    // 문자열에서 "a와c사이에 b가 0개이상 존재"와 패턴이 일치하는지 검사하는 정규표현식.
    regex = /ab*c/;
    regex.test("abc");// true
    regex.test("ab");// true
    regex.test("adc")// false
    regex.test("abdc")// false


다양한 메타문자.

 \ ( 역슬래시 )

        
    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


'웹 개발 > 자바스크립트' 카테고리의 다른 글

CallByValue 와 CallByReference  (0) 2018.04.26


@Table : 테이블 지정.

catalog

- optional 설정값이며 database catalog를 지정한다. 

name

- optional 설정값이며 table의 이름을 설정한다. 



@GeneratedValue :  기본키를 생성하는 전략을 설정함.

Identity

- 기본키 생성을 데이터베이스에 위임함. 예를 들어 mysql과 oracle이 기본키를 자동 생성해주는 방식이 다른데 각 db 벤더사에 기본키 생성을 위임
.

@ManyToOne, @OneToMany : 테이블 간 다대일, 일대다  관계를 설정하는 어노테이션. 

fetch

  • FetchType.EAGER (즉시로딩)
    • 해당 엔티티가 조회될 때 관계되는 엔티티를 즉시 로딩한다.
  • FetchType.LAZY (지연로딩)
    • 관계되는 엔티티를 사용할 때 데이터를 로딩한다.

cascade

  • CascadeType.PERSIST
    • 생성된 entity에 persist() 수행 시 연관 엔티티도 persist() 작업 수행
  • CascadeType.MERGE
    • detatch상태의 entity에 merge() 수행 시 연관 엔티티도 merge() 작업 수행
  • CascadeType.REMOVE
    • 해당 entity삭제시에 연관 엔티티도 함께 삭제 됨.
  • CascadeType.REFRESH
  • CascadeType.DETACH
  • CascadeType.ALL
    • 모든 CascadeType 적용



+ Recent posts