IntelliJ 단축키 정리


Eclipse를 사용하다가 IntelliJ로 넘어오면서 전혀 다른 단축키 때문에 힘드시죠?

File > Settings - Keymap 에서 Eclipse 단축키로 사용할 수 있도록 변경이 가능하니 참고하세요~

저는 새로운 마음가짐으로 시작하려고 IntelliJ에 적응하느라 초반에 좀 고생했어요

Eclipse에서 주로 사용하던 단축키 모음을 추려서 IntelliJ 단축키와 맵핑시켜 정리해서 사용할 때 마다 보면서 적응하게 됐어요.



JETBRANS IntelliJ 단축키 PDF - https://resources.jetbrains.com/storage/products/intellij-idea/docs/IntelliJIDEA_ReferenceCard.pdf


- Mac OS X

- Windows / Linux


'Development > Tool' 카테고리의 다른 글

IntelliJ PMD Plugin  (0) 2018.08.04
VirtualBox 해상도 조절  (0) 2017.07.28

영속성 관리


* 엔티티 매니저 팩토리 & 엔티티 매니저
엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하므로 서로 다른 스레드 간에 공유해도 되지만,
엔티티 매니저는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유하면 안된다.

1
2
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
EntitiManager em = emf.createEntityManger();

cs


데이터베이스 연결이 꼭 필요한 시점까지 커넥션을 얻지 않고 트랜잭션을 시작할 때 커넥션을 획득한다.

영속성 컨텍스트
- 엔티티 매니저 생성시 생성되는 엔티티 영구 저장 환경.
- 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.

* 엔티티의 생명주기
비영속(New/Transient) : 영속성 컨텍스트와 전혀 관계 없는 상태. 엔티티 객체 생성후 저장되지 않은 상태.
영속(Managed) : 영속성 컨텍스트에 저장된 상태. 영속성 컨텍스트에 의해 관리된다.
준영속(Detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태. 영속성 컨텍스트에 의해 관리되지 않는다.
삭제(Removed) : 삭제된 상태. 영속성 컨텍스트와 DB에서 삭제된 상태.

* 영속성 컨텍스트 특징
- 영속 상태는 식별자 값이 반드시 있어야 한다.
- 트랜잭션을 커밋하는 순간 영속성 컨텍스에 새로 저장된 엔티티를 DB에 반영한다. flush
- 장점) 1차 캐시, 동일성 보장, 트랜잭션을 지원하는 쓰기 지연, 변경감지, 지연로딩. (CRUD 통해 설명)

# 엔티티 조회 em.find(entity class, key)
1차 캐시 : 영속 상태의 엔티티 저장소로 Map 형태에 @Id로 매핑할 식별자와 엔티티 인스턴스 값을 저장한다.
동일성 보장 : 조회 쿼리 호출시 1차 캐시에서 엔티티를 찾고, 없으면 DB에서 조회하여 1차 캐시에 저장시킨 후 엔티티를 반환한다.
지연로딩 : 일대다 혹은 다대다 관계의 컬렉션을 실제 사용하는 시점까지 DB 조회를 지연한다. (자세한 내용은 다음 챕터에..)
- JPA는 1차 캐시를 통해 REPEATABLE READ 레벨의 트랜잭션 격리 수준을 DB가 아닌 애플리케이션 차원에서 제공한다는 장점이 있다.

# 엔티티 등록 : em.persist(entity)
트랜잭션을 지원하는 쓰기 지연 : 엔티티 메니저는 트랜잭션을 커밋하기 전까지 엔티티를 DB에 저장하지 않고 쓰기 지연 SQL 저장소에 등록 쿼리를 쌓아 놓는다. 그리고 커밋시에 한번에 SQL을 DB에 전달한다.
- 트랜잭션 커밋 직전에만 DB에 SQL을 전달하면 되기 때문에 쓰기지연이 가능하다. 쿼리를 한번에 전달해서 성능을 최적화할 수 있다.

# 엔티티 수정 
스냅샷 : 엔티티를 영속성 컨텍스트에 보관할 때, 최초 상태를 복사해서 저장해 둔다.
변경감지 : 엔티티의 변경사항을 DB에 자동으로 반영한다. 트랜잭션을 커밋하면 엔티티 매니저 내부에서 플러시가 호출된다. 엔티티와 스냅샷을 비교해 변경된 엔티티가 있으면 쓰기 지연 SQL 저장소에 수정 쿼리를 쌓아 놓고 한번에 SQL을 DB에 전달한다.

# 엔티티 삭제 : em.remove(entity)
- 삭제할 엔티티를 우선 조회한다. 그리고 삭제하면 삭제 쿼리를 쓰기 지연 SQL 저장소에 쌓아 놓는다. 그리고 커밋시에 한번에 SQL을 DB에 전달한다.
- 삭제를 요청한 엔티티는 영속성 컨텍스트에서 제거되므로 사용하지 말고 가비지 컬렉션의 대상이 되도록 두는 것이 좋다.

* 플러시 : em.flush()
- 트랜잭션을 커밋하는 순간 영속성 컨텍스트의 변경 내용을 DB에 동기화한다.
- 플러시 실행시 변경감지가 동작해서 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해서 수정된 엔티티를 찾아 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 등록한다. 쓰기 지연 SQL 저장소의 쿼리를 DB에 전달한다. (등록/수정/삭제 쿼리)
- 영속성 컨텍스트를 플러시하는 방법은 다음과 같다.
1) em.flush() 직접 호출 - 테스트 외에 거의 사용하지 않는다.
2) 트랜잭션 커밋시 자동 호출
3) JPQL 쿼리 실행시 자동 호출

* 준영속
- 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다.
- 비영속 상태와 흡사하지만 식별자 값은 가지고 있다.
- 영속 상태의 엔티티를 준영속 상태로 만드는 방법은 다음과 같다.
1) em.detach(entity) - 특정 엔티티를 영속성 컨텍스트로부터 분리. 1차 캐시와 쓰기 지연 SQL 저장소에 해당 엔티티를 관리하는 정보 제거한다.
2) em.clear() - 영속성 컨텍스트 초기화. 영속성 컨텍스트의 모든 엔티티를 준영속 상태로 만든다.
3) em.close() - 영속성 컨텍스트를 종료해 모두 준영속 상태가 된다.

* 병합 : em.merge(entity) 
- 파라미터로 넘어온 엔티티의 식별자 값으로 1차 캐시를 조회하고 찾는 엔티티가 없으면 DB에서 조회한다. DB에도 없으면 새로운 엔티티를 생성해 반환한다. 
따라서, 준영속/비영속 상태에 관계없이 영속 상태의 엔티티를 반환하는 insert/update 기능을 수행한다.


참고서적 - 자바 ORM 표준 JPA 프로그래밍 (김영한)
그림으로 이해를 돕는 http://www.slideshare.net/zipkyh/ksug2015-jpa3-jpa

'Development > JPA' 카테고리의 다른 글

엔티티 매핑  (0) 2017.11.12
JPA 시작  (0) 2016.11.20
JPA 소개  (0) 2016.05.04

Web & WAS


Web과 WAS를 소개하기에 앞서 정적/동적 페이지를 알아야 한다.

정적 페이지
- 어떤 요청이든지 항상 동일한 내용이 반환되는 페이지
- 주로 HTML, CSS, JS, Image 등으로 이루어진 페이지

동적 페이지
- 동일한 리소스의 요청이라도 요청에 따라 각기 다른 내용이 반환되는 페이지 
- 코드가 포함되어 있어 페이지 요청 시점에 만들어지는 페이지


Web Server
클라이언트의 요청을 받아 처리하고, 그 결과를 웹 클라이언트에게 응답하는 역할을 한다.
주로 정적 페이지인 HTML, CSS, JS 등을 웹 클라이언트에 제공할 때 사용하며, 동적인 페이지 처리가 필요하면 요청을 WAS로 넘긴다.
- Apache, IIS, Nginx 등


Web Container
JSP와 서블릿을 실행시킬 수 있는 소프트웨어로 웹 서버에서 JSP를 요청하면 서블릿으로 변환하여 컴파일하고 그 결과를 웹 서버에 전달한다.


WAS (Web Application Server)
웹 서버와 웹 컨테이너의 결합 형태로 정적 페이지 뿐만 아니라 동적인 페이지도 처리한다.
주로 웹 서버에서 넘어온 동적인 페이지를 처리하여 웹 서버로 돌려준다.
- Tomcat, Jetty, JEUS, Web Logic 등


WAS는 대부분 웹 서버의 기능을 가지고 있다. 그럼에도 다른 웹 서버와 연동해서 사용하는 이유는 아래와 같다.
- WAS는 웹 서버 만큼 정적인 문서를 빠르게 처리하지 못한다.
- WAS는 웹 서버 만큼 다양한 옵션 및 환경 설정 기능을 제공하지 못한다.
- WAS는 웹 서버 만큼 안정적이지 못하다.


웹 서버와 WAS를 연동한 구조


WS(웹 서버)와 WAS를 기능적으로 분류해 효과적인 분산을 유도한 형태이다.

정적인 데이터는 앞단의 WS에서 처리하고, 동적인 데이터는 뒷단의 WAS에서 처리한다.
사용자의 요청에 대해 정적인 데이터를 앞단의 WS에 위치시켜 처리함으로써 WAS로 서비스 요청이 넘어가지 않게 한다.

또한, 웹 애플리케이션 서비스를 뒷단의 WAS에 넘겨줌으로써 WAS는 웹 애플이케이션의 수행에 집중할 수 있다.
WS에서 처리할 것과 WAS로 넘길 것을 처리하는 방식은 WS의 환경설정를 통해 처리할 수 있다. 

'Development > WAS' 카테고리의 다른 글

Tomcat Cookie Domain 에러  (0) 2017.12.02
Tomcat 서비스 설치/삭제  (0) 2016.10.29
JPA 시작

* pom.xml 설정 
- hibernate-core : 하이버네이트 라이브러리
- hibernate-entitymanager : 하이버네이트가 JPA구현체로 동작하도록 JPA 표준을 구현한 라이브러리
- hibernate-jpa-2.1-api : JPA2.1 표준 API를 모아둔 라이브러리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
..
<properties>
  <hibernate.version>버전</hibernate.version>
</properties>
 
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>${hibernate.version}</version>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>${hibernate.version}</version>
  <exclusions>
    <exclusion>
      <artifactId>commons-collections</artifactId>
      <groupId>commons-collections</groupId>
    </exclusion>
  </exclusions>
</dependency>
..
cs

* 객체 매핑
1
2
3
4
5
6
7
8
9
10
11
12
13
@Entity
@Table(name="MEMBER")
public class Member {
 
    @Id
    @Column(name = "ID")
    private String id;
 
    @Column(name = "NAME")
    private String username;
 
    private Integer age;
}
cs
- @Entity : 클래스를 테이블과 매핑한다고 JPA 에게 알림. 엔티티 클래스라고함.
- @Table : 엔티티 클래스에 매핑할 테이블 정보를 알림. 생략시 클래스이름을 테이블 이름으로 매핑함.
- @Id : 엔티티 클래스의 필드를 테이블의 기본 키에 매핑함.
- @Column : 필드를 컬럼에 매핑함. 생략시 필드명으로 컬럼명에 매핑함. 대소문자를 구분하는 데이터베이스 사용시 명시적으로 매핑해야함.


* persistence.xml 설정 
: JPA를 실행하기 위한 기본 설정파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
  <persistence-unit name="jpabook">
    <properties>
      <!-- 필수 속성 -->
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> // JDBC 드라이버
      <property name="javax.persistence.jdbc.user" value="root" /> // DB 접속 아이디
      <property name="javax.persistence.jdbc.password" value="" /> // DB 접속 비밀번호
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/test" /> // DB  접속 URL
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> // DB 방언
 
      <!-- 옵션 -->
      <property name="hibernate.show_sql" value="true" /> // 실행 쿼리문 출력여부
      <property name="hibernate.format_sql" value="true" /> // 쿼리문 정렬 출력여부
      <property name="hibernate.use_sql_comments" value="true" /> // 쿼리문 주석 출력여부
      <property name="hibernate.hbm2ddl.auto" value="validate" /> // 스키마 자동 생성
    </properties>
  </persistence-unit>
</persistence>
cs

- META-INF/persistence.xml 클래스 패스 경로에 있으면 별도의 설정 없이 JPA가 인식함.
- JPA 설정은 영속성 유닛으로부터 시작하는데 일반적으로 연결할 데이터베이스당 하나의 영속성 유닛을 등록함. 고유한 이름을 사용해야함.
- javax.persistence로 시작하는 속성은 JPA 표준 속성으로 특정 구현체에 종속되지 않음. 
  반면에 hibernate로 시작하는 속성은 하이버네이트 전용 속성이므로 하이버네이트에서만 사용 가능함.
hibernate.hbm2ddl.auto : 데이터베이스 스키마 자동 생성 설정
> create : 기존 테이블 삭제 후 재생성. 초기 개발시 사용.
> create-drop : create와 동일하나 종료시 테이블 삭제. 초기 개발시 사용.
> update : 스키마 변경 내역 반영. 초기 개발시 사용 .운영 DB에 사용해서는 안됨.
> validate : 엔티티와 테이블의 매핑 정상 여부 체크. 비정상시 예외 발생. 운영 DB에 사용.

* 데이터베이스 방언
- JPA는 애플리케이션에 특정 DB에 종속되지 않게 하는 벤더독립성을 가짐.
  하지만 각 데이터베이스마다 데이터 타입, 함수명, 페이징처리 등이 다르기 때문에
  SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능을 JPA에서는 방언(Dialect)라고함.

- 데이터베이스가 변경되어도 애플리케이션 코드를 변경할 필요없이 데이터베이스 방언만 교체하면됨.

- 대표적인 방언
  Mysql : org.hibernate.dialect.MySQLDialect
  Oracle : org.hibernate.dialect.OracleDialect
  H2 : org.hibernate.dialect.H2Dialect

* 애플리케이션 개발

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class JpaMain {
 
  public static void main(String[] args) {
 
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook"); //엔티티 매니저 팩토리 생성
    EntityManager em = emf.createEntityManager(); //엔티티 매니저 생성
    EntityTransaction tx = em.getTransaction();   //트랜잭션 기능 획득
    
    try {
      tx.begin();    //트랜잭션 시작
      logic(em);     //비즈니스 로직
      tx.commit();   //트랜잭션 커밋
    } catch (Exception e) {
      e.printStackTrace();
      tx.rollback(); //트랜잭션 롤백
    } finally {
      em.close();    //엔티티 매니저 종료
    }
      emf.close();   //엔티티 매니저 팩토리 종료
    }
 
  }
 
}
cs

- 엔티티 매니저 팩토리 생성
persistence.xml 의 설정 정보를 조회해 이름이 jpabook인 영속성 유닛 persistence-unit을 찾아서 엔티티 매니저 팩토리를 생성.
설정 정보를 읽어서 JPA를 동작 시키기 위한 기반 객체를 만들고 JPA 구현체에 따라 데이터베이스 커넥션 풀도 생성.
엔티티 매니저 팩토리를 애플리케이션 전체에서 딱 한번만 생성하고 공유해서 사용해야함.

- 엔티티 매니저 생성
엔티티 매니저 팩토리에서 엔티티 매니저 생성.
JPA 기능 대부분은 엔티티 매니저가 제공함.
엔티티 매니저를 사용해서 엔티티를 데이터베이스에 등록/수정/삭제/조회 할 수 있음.
엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 공유하거나 재사용해서는 안됨.

- 트랜잭션 관리
엔티티 매니저에서 트랜잭션 API를 받아서 사용함.
비즈니스 로직이 정상 동작하면 트랜잭션을 커밋하고, 예외가 발생하면 트랜잭션을 롤백함.

- 비즈니스 로직
  저장 : em.persist(Object);
  조회 : em.find(Object, PK);
  삭제 : em.remove(Object);
  수정 : 엔티티 매니저를 통해 객체를 조회하여 Setter 메소드를 통해 값 변경. JPA의 변경감지 기능을 통해 수정.

- 엔티티 매니저 팩토리 & 엔티티 매니저 종료
사용이 끝난 엔티티 매니저는 반드시 종료해야함.
애플리케이션을 종료할 때는 엔티티 매니저 팩토리도 종료해야함.


참고서적 - 자바 ORM 표준 JPA 프로그래밍(김영한)

'Development > JPA' 카테고리의 다른 글

엔티티 매핑  (0) 2017.11.12
영속성 관리  (0) 2017.01.21
JPA 소개  (0) 2016.05.04


우선, 톰캣을 설치하기 위해 http://tomcat.apache.org/ 사이트에 들어가 원하는 버전의 톰캣을 다운받아 압축을 해제한다.


서비스를 등록하기 위해 cmd 창에서 톰캣이 설치된 디렉토리로 이동한다.

혹은 apache-tomcat-버전\bin 디렉토리로 이동해 Shift + 마우스 우클릭하여 '여기서 명령창 열기'를 클릭한다.

1
~\bin> service.bat install
cs

해당 경로에서 위와 같이 명령어를 입력하여 실행하면 서비스가 정상적으로 설치된다.

실행창(Win + R)에 services.msc를 입력하면 서비스 창이 나오는데 Apache Tomcat 버전이 등록되었고 시작 및 중지 시킬 수 있다.

서비스를 시작시킨 후 http://localhost:8080/를 요청하면 기본적으로 톰캣 고양이가 나타날 것이다. 잘 설치되었음을 알 수 있다.


서비스를 제거하기 위해 동일하게  cmd 창에서 톰캣이 설치된 디렉토리로 이동한다.

1
~\bin> service.bat remove
cs

해당 경로에서 위와 같이 명령어를 입력하여 실행하면 서비스가 정상적으로 제거된다.


* 삭제시 유의사항

설치된 톰캣 디렉토리만 삭제한다고 해서 서비스가 삭제되지 않는다. 

반드시, 먼저 명령을 실행시켜 서비스 창에서 등록된 서비스가 지워진 것을 확인한 후에 디렉토리를 삭제해야 한다.

'Development > WAS' 카테고리의 다른 글

Tomcat Cookie Domain 에러  (0) 2017.12.02
Web & WAS  (0) 2016.12.12

Spring Boot 에러페이지 설정


Spring Boot는 xml 파일을 강요하지 않기 때문에 프로젝트를 생성하면 web.xml 파일이 자동 생성되지 않는다.

물론 web.xml 파일을 만들어 에러페이지를 설정하는 등 방법은 여러가지이다.

다음은 스프링부트에서 에러페이지를 심플하게 설정하는 방법 중 하나이다. 


발생하는 에러코드(HttpStatus)에 나타낼 ErrorPage를 설정해 컨테이너에 추가한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Configuration
public class ErrorConfig {
 
  @Bean
  public EmbeddedServletContainerCustomizer containerCustomizer() {
    return new EmbeddedServletContainerCustomizer() {
 
      @Override
      public void customize(ConfigurableEmbeddedServletContainer container) {
        ErrorPage error403Page = new ErrorPage(HttpStatus.FORBIDDEN, "/403.html");
        ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/404.html");
        ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500.html");
 
        container.addErrorPages(error403Page, error404Page, error500Page);
      }
    };
  }
 
}
cs


src/main/resources/static 하단 경로에 보여줄 에러페이지를 생성한다.


:설정한 에러코드가 발생하면 해당하는 에러 화면을 보여준다. 


'Development > SpringBoot' 카테고리의 다른 글

Spring / Spring Boot 설정 비교  (0) 2016.05.15
Spring Boot 외장 톰캣 연동  (0) 2016.05.14
Spring Boot 소개  (0) 2016.04.17

Spring / Spring Boot 설정 비교


Spring Boot의 강점으로 Spring에서의 복잡한 설정들을 심플하게 할 수 있다.

Spring / Spring Boot 간의 차이를 간단한 예제로 비교해봤다. (Spring : xml 설정 방식 사용)


* Spring

servlet-context.xml (JSP View)

root-context.xml (MySQL 연동)

logback-spring.xml (Log 설정)

pom.xml (의존 라이브러리 설정)

web.xml (필터/리스너 설정)


* Spring Boot

pom.xml 

spring-boot-starter-parent가 의존 라이브러리들의 표준 버전을 정의한다.

각 spring-boot-starter 모듈이 해당 모듈을 사용하는데 관련된 설정을 한다.

application.properties (xml 파일 대신 권장)


간단한 프로젝트를 구성하는데도 Spring에서는 설정이 매우 복잡하였으나 Spring Boot에서는 심플하게 설정할 수 있다.

'Development > SpringBoot' 카테고리의 다른 글

Spring Boot 에러페이지 설정  (0) 2016.05.18
Spring Boot 외장 톰캣 연동  (0) 2016.05.14
Spring Boot 소개  (0) 2016.04.17
Spring Boot 외장 톰캣 연동

Spring Boot는 기본적으로 내장 톰캣을 지원한다. 
다음은 내장 톰캣이 아닌 외장 톰캣을 사용하는 방법이다.

1) 톰캣 설치 후 서비스 등록/실행

2) pom.xml 설정
* dependency 추가 
1
2
3
4
5
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
  </dependency>
cs


* WAR 패키징 (jar->war)

3) Initialize 추가

SpringBootServletInitializer를 상속 받아 SpringApplicationBuiler 메소드를 오버라이딩 해준다.

1
2
3
4
5
6
7
8
public class AppInitializer extends SpringBootServletInitializer {
 
  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(Application.class);
  }
 
}
cs

4) 톰캣경로\conf\server.xml 수

<Host name="localhost"  appBase="프로젝트 경로"
         unpackWARs="true" autoDeploy="true"
         xmlValidation="false" xmlNamespaceAware="false">

5) 톰캣경로\bin\tomcat7w.exe 실행 -> Start


'Development > SpringBoot' 카테고리의 다른 글

Spring Boot 에러페이지 설정  (0) 2016.05.18
Spring / Spring Boot 설정 비교  (0) 2016.05.15
Spring Boot 소개  (0) 2016.04.17
JPA 소개


* JPA 사용 전 

- 거듭 반복되는 코드
1. CRUD 기능 구현을 위한 SQL 작성
SELECT id, name FROM Member WHERE id = ?

2. JDBC API를 사용해 SQL 실행
ResultSet rs = stmt.executeQuery(sql);

3. 결과 값을 객체로 매핑
String id = rs.getString("id");
String name = rs.getString("name");
Member member = new Member();
member.setId(id);
member.setNam(name);
: SQL Mapper의 사용으로 JDBC API 코드를 덜어주지만 SQL 작성은 해야 한다.

- DB 스키마 변경에 따른 코드 수정 복잡

- 패러다임 불일치

객체
관계형 데이터베이스
상속
상속
슈퍼타입과 서브타입
연관관계
참조
외래키를 통해 조인
객체 그래프 탐색
참조를 통해 제한없이 탐색
SQL 조인 범위에 따른 탐색 범위 고정
비교
== 주소값 비교 
equals() 객체 내부 값 비교
PK로 각 row 구분
모델링
객체 지향 모델링
데이터 모델링
: 개발자가 객체와 관계형 데이터베이스 사이의 패러다임 불일치 문제를 해결하는 데 많은 시간과 코드 소요


* JPA 소개

- 개발자가 직접 SQL을 작성하지 않고 JPA가 제공하는 API를 사용하면 JPA가 적절한 SQL을 생성해 DB에 전달

- 자바 진영의 ORM 기술 표준 (객체와 관계형 데이터베이스 테이블 사이의 매핑 처리를 하여 각각 객체모델링과 데이터모델링 가능)

- JPA 동작 구조

- JPA 사용 이유
  표준  다른 구현 기술로 변경 용이
  성능  동일 트랜잭션 내 데이터 중복 조회시 한 번만 DB에 전달
  생산성  반복되는 SQL 작성과 JDBC API 사용 대신 처리
  유지보수  엔티티 변경에 대한 수정 코드 작성량 감소
  패러다임 불일치 해결  상속, 연관관계, 객체 그래프 탐색, 비교 문제 해결
  데이터 접근 추상화와 벤더 독립성  특정 DB 기술 종속 X (DB Dialect 설정) 

- 단점 : 학습 곡선 매우 높음 (객체와 관계형 데이터베이스의 상위)


'Development > JPA' 카테고리의 다른 글

엔티티 매핑  (0) 2017.11.12
영속성 관리  (0) 2017.01.21
JPA 시작  (0) 2016.11.20

Spring Boot 란 ?

: 스프링 기반의 애플리케이션을 쉽고 빠르게 개발할 수 있도록 해주는 스프링 프레임워크의 서브 프로젝트



- 의존성 자동 설정 지원

- 환경설정 심플 (application.properties 지원)

- 내장 WAS(Tomcat, Jetty, Undertow) 사용으로 빠르게 실행

- 웹 애플리케이션을 JAR 파일로 패키징하여 쉽게 배포 및 실행 가능

- Actuator 서비스 운영 지원 정보 제공



* 스프링 부트 프로젝트 생성 및 실행

Web 모듈 체크해 프로젝트 생성 -> hello() 메소드 작성 -> 프로젝트 실행 -> /hello 요청 -> 화면 출력

              


@SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan 

@Configuration 

: 해당 클래스가 JavaConfig용 클래스임을 컴파일러에게 알림

@EnableAutoConfiguration 

classpath의 내용을 기반으로 다양한 설정을 자동으로 수행

@ComponentScan 

: 해당 클래스의 패키지 내부에 있는 모든 클래스를 검색해 특정 애노테이션이 표시된 자바 클래스를 찾아 DI 컨테이너에 등록


@RestController = @ResponseBody + @Controller

@ResponseBody

핸들러 메소드의 리턴 값을 HTTP Response를 통해 바로 전달

@Controller

: 해당 클래스가 웹 애플리케이션에서 요청을 받아들이는 컨트롤러 클래스임을 알림


@RequestMaping

: 해당 메소드가 HTTP 요청을 받아들이는 메소드임을 알림

SpringApplication.run() 

: 이 메소드로 애플리케이션 실행. 이 때, 첫번째 인자는 @EnableAutoConfiguration 어노테이션이 선언된 클래스명 지정


'Development > SpringBoot' 카테고리의 다른 글

Spring Boot 에러페이지 설정  (0) 2016.05.18
Spring / Spring Boot 설정 비교  (0) 2016.05.15
Spring Boot 외장 톰캣 연동  (0) 2016.05.14

+ Recent posts