반응형
JPA(Java Persistence API) 란?

자바 진영의 ORM 기술표준으로, 인터페이스의 모음이다.  ※ 출처참조

 

 

환경
IntelliJ IDEA Ultimate 2021. 3. 2
Gradle 7.4.1
MySQL 5.7

 

 

 

 

Build.gradle 의존성 추가
dependencies {
      implementation 'mysql:mysql-connector-java'
      implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
 }

 

 

application.properties에 DB 정보 입력
# MySQL 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# DB Source URL
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/Schema?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul

#DB Username
spring.datasource.username=<username>

#DB Password
spring.datasource.password=<password>

#true 설정시 JPA 쿼리문 확인 가능
spring.jpa.show-sql=true

#DDL(Create, Alter, Drop) 정의시 DB의 고유 기능을 사용할 수 있다.
spring.jpa.hibernate.ddl-auto=update

# JPA의 구현체인 Hibernate가 동작하면서 발생한 SQL의 가독성을 높여준다.
spring.jpa.properties.hibernate.format_sql=true

spring.jpa.hibernate.ddl-auto=[]

  • create : 기존 테이블을 삭제하고 새로 생성 [ Drop + Create ]
  • create-drop : Create 속성에 추가로 어플리케이션을 종료할 때 생성한 DDL을 제거 [ Drop + Create + Drop]
  • update : DB 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정 [ 테이블이 없을 경우 Create ]
  • validate : DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 어플리케이션을 실행하지 않음
  • none : 자동 생성 기능을 사용하지 않음

 

 

JPA Entity 생성?
@ToString
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table (name ="tbl_memo") // 클래스명과 테이블명이 다를때 매핑시켜주기위해 사용
@Entity
public class Memo {
    @Id
    @GeveratedValue(strategy = GenerationType.IDENTITY) //MySQL의 Auto_INCREMENT를 사용
    private Long id;

    @Column(length =200, nullable =false)
    private String memoText;
}

 

사용 어노테이션 정리

 

  • @Entity : DB의 테이블을 뜻함 [ Spring Data JPA 에서는 반드시 @Entity 어노테이션을 추가해야함]
  • @Table : DB 테이블의 이름을 명시 [ 테이블 명과 클래스 명이 동일한 경우 생략가능 ]
  • @Getter : Lombok의 Getter를 이용해 Getter 메소드를 생성하고 @Builder를 이용해서 객체를 생성할 수 있게처리한다.
  • @Builder를 이용하기 위해 @AllArgsContructor@NoArgsContructor를 같이 처리해야 컴파일 에러가 발생하지 않음
  • @Id : Privary Key를 뜻함
  • @HeneratedValue : Primary Key의 키 생성 전략(Strategy)을 설정하고자 할 때 사용
  1. GenerationType.IDENTITY : MySQL의 AUTO_INCREMENT 방식을 이용
  2. GenerationType.AUTO(default: JPA구현체(Hibernate)가 생성 방식을 결정
  3. GenerationType.SEQUENCE: DB의 SEQUENCE를 이용해서 키를 생성 . @SequenceGenerator와 같이 사용
  4. GenerationType.TABLE: 키 생성 전용 테이블을 생성해서 키 생성. @TableGenerator와 함께 사용
  • @Column : DB Column을 명시
  • @Transient : @Column과 반대로 테이블에 컬럼으로 생성되지 않은 필드의 경우에 사용한다.

 

 

JPA Repository 생성

Spring Data JPA는 JPA의 구현체인 Hibernate를 이용하기 위한 여러 API를 제공합니다.

그 중에서 가장 많이 사용되는 것이 JPA Repository라는 인터페이스입니다.

 

public interface MemoReporisotry extends JpaRepository<Memo, Long> {

}

작성된 MemoRepository는 JpaRepository를 상속하는 것만으로 모든작업이 끝납니다.

  • MemoRepository를 이용해서 작성된 테이블에 SQL문 없이 CRUD 작업을 할 수 있게 됩니다.
  • JpaRepository의 제네릭 타입으로는 <Entity, PK의 타입>을 지정해주면 Spring Data JPA는 자동으로 스프링의 빈(bean)으로 등록됩니다.
  • Spring이 내부적으로 인터페이스 타입에 맞는 객체를 생성해서 bean으로 등록

 

테스트를 통한 CURD 기능 확인

1.1 Create 테스트

 

Insert를 할 때 Repository 객체의 save()메소드를 사용합니다.

 

@SpringBootTest
pulbic class MemoRepositoryTest{
    @Autowired
    MemoRepository memoRepository;

    @Test
    public void InsertDummies() {
        IntStream.rangeClosed(1, 10).forEach( i -> {
            Memo memo = Memo.builder()
                                          .memoText("Sample...." + i)
                                          .build();
            //Create!
            memoRepository.save(memo);
        });
    }
}

 

1.2 Read 테스트

 

Select를 할 때 Repository 객체의 findById() 메소드를 사용합니다.

findById()를 통해 기본키를 넣어주면, 해당하는 객체를 Optional 타입으로 반환해줍니다.

@SpringBootTest
pulbic class MemoRepositoryTest{
    @Autowired
    MemoRepository memoRepository;

    @Test
    public void SelectDummies() {
        Long id = 10L;

        Optionam<Memo> result = memoRepository.findById(id);

        System.out.println("------------------------------------------";
          if(result.isPresned()){
               Memo memo = result.get();
               System.out.println(memo);
        }
    }
}

 

1.3 Update 테스트

 

수정 작업과 등록작업은 동일하게 save()를 이용해서 처리합니다.

내부적으로 해당 엔티티의 @Id값이 일치하는지를 확인해서 Insert 혹은  Update작업을 처리합니다.

 

@SpringBootTest
pulbic class MemoRepositoryTest{
    @Autowired
    MemoRepository memoRepository;

 @Test
    public void UpdateDummies() {
        Memo memo = Memo.builder()
                                      .id(10L)
                                      .memoText("Update Text")
                                      .build();
        memoRepository.save(memo);
    }
}

 

 

1.4 Delete 테스트

 

삭제 작업도 수정 작업과 동일한 개념으로 삭제하려는 엔티티 객체가 있는지 먼저 확인하고, 삭제합니다

@SpringBootTest
pulbic class MemoRepositoryTest{
    @Autowired
    MemoRepository memoRepository;

    @Test
    public void DeleteDummies() {
        Long id = 10L;
        
        memoRepository.deleteById(id);
    }
}

 

 

출처

https://dev-coco.tistory.com/85

 

[Spring Boot] MySQL & JPA 연동 및 테스트 (Gradle 프로젝트)

SpringBoot에서 MySQL 그리고 Spring Data JPA를 연동하는 방법에 대해 알아보도록 하겠습니다. 1. 프로젝트에 의존성 추가하기 build.gradle에 의존성을 아래와 같이 추가해줍니다. dependencies { implementatio..

dev-coco.tistory.com

 

 

감사합니다.

 

반응형
반응형
Lombok이란?

Lombok은 자바 Domain(DTO, VO) 에서 반복적으로 작성되는 getter/setter나 toString, 생성사 코드 등의 소스들을, 어노테이션(Annotaion)을 사용하여 생략할 수 있도록 컴파일 시점에 자동으로 생성해주는 라이브러리이다.

 

환경
IntelliJ IDEA Ultimate 2021. 3. 2
Gradle 7.4.1

※IntelliJ 2020.03 이후 버전에서는 기본Plugin으로 Lombok이 설치되어 있습니다.

 

설치방법

파일 -> 설정 -> 플러그인 -> Lombok 검색 후 설치

 

Dependency 설정하기

Lombok Plugin을 사용하기 위해서는 dependency에 추가되어야만 사용이 가능하다.

 

Gradle 7.4.1

//build.gradle
...
dependencies {
     //lombok plugin
     implementation 'org.projectlombok:lombok'
     annotationProcessor 'org.projectlombok:lombok'

     //default
     implementation 'org.springframework.boot:spring-boot-starter-web'
     testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

Annotation Processing 설정하기

어노테이션 프로세싱 활성화를 해주어야 어노테이션 기반인 lombok을 사용할 수 있습니다.

파일 -> 설정 -> 빌드,실행,배포 -> 컴파일러 -> 어노테이션프로세서 에서 어노테이션 처리 활성화를 체크해준다

 

 

Lombok의 Annotation

@Getter/@Setter

  • 어노테이션을 붙인 클래스 멤버 변수들 혹은 특정 변수의 getXXX(), setXXX() 메소드를 생성한다.
  • 기본적으로 public method로 선언된다.
  • @Setter(AccessLevel.PRIVATE)처럼 AccessLevel을 통하여 접근권한을 설정할 수 있다. (PRIVATE, PROTECTED 등)
  • @Setter 같은 경우는 무결성이 보장되어야 하는 클래스나 변수에는 사용을 지양해야 한다.

 

@ToString

  • 어노테이션을 붙인 클래스의 toString() 메소드를 생성한다.
  • @ToString(callSuper = true)를 사용하면 상속받은 클래스의 정보까지 출력된다. (default값은 false)
  • @ToString을 붙인 클래스에 순환 참조를 하는 객체 타입 필드가 있다면, 무한 루프가 발생한다.
  • ex1) 클래스 A에 어노테이션을 붙였는데, A의 멤버 변수에 클래스 B타입이 있고 B의 멤버 변수에 클래스 A타입이 있을 경우 무한루프 발생
  • solution) @Tostring(exclude = "A")와 같이 명시적으로 해당 필드를 제외시켜줘야 한다.

 

@NonNull

  • 어노테이션을 붙인 변수는 반드시 값이 있어야 한다.
  • Setter에 null 값이 들어오게 되면 NulPointerException이 발생하게된다.
  • @NonNull은 불필요하게 branch coverage를 증가시키므로 사용이 권장되지는 않는다.

@NoArgsConstructor

  • 어노테이션이 붙은 클래스의 기본 생성자를 생성한다.
  • AcessLevel 을 통하여 접근권한을 설정할 수 있다.
  • 기본값은 Public 이지만, Protected 를 사용하여 안전성을 보장해주는 것을 권장한다.

@RequiredArgsConstructor

  • 어노테이션이 붙은 클래스의 final 혹은 @NonNull인 필드만을 포함한 생성자를 생성한다.
  • AccessLevel을 통하여 접근권한을 설정할 수 있다.
  • 필드에 잘못된 값이 들어가도 에러를 뱉이 않을수도 있기에 사용에 주의가 필요하다.

@AllArgsConstructor

  • 어노테이션이 붙은 클래스의 모든 필드를 포함한 생성자를 생선한다.
  • AccessLevel을 통하여 접근권한을 설정할 수 있다.
  • 필드에 잘못된 값이 들어가도 에러를 뱉지 않을수도 있기에 사용에 주의가 필요하다.

@EqualsAndHashCode

  • 어노테이션이 붙은 클래스에 equals()hashCode() 메소드를 생성한다.
  • exclude를 통하여 특정 필드를 제외시킬 수 있다.
  • equals() - 두 객체의 내용이 같은지 비교하는 메소드이다.
  • hashCode() - 해당 객체의 해시값을 반환하는 메소드이다.

@Data

  • @Getter, @Setter, @EqualsAndHashCode, @RequiredArgsConstructor, @ToString 을 포함한다.
  • @Data(staticConstructor = "foo") 와 같이 foo라는 static factory method를 생성 할 수도 있다.

@Value

  • 어노테이션이 붙은 클래스를 불변(Immutable) 클래스로 선언한다.
  • 모든 필드와 클래스를 기본적으로 private 및 final로 선언하고, setter 메소드를 생성하지 않는 점을 제외하곤 @Data와 비슷하다.

@Cleanup

  • close() 메소드를 자동으로 호출해주어, close()관련 코드 작성을 최소화 할 수 있다.

 

@Synchronized

  • synchronized 키워드를 사용할 때 데드락이 발생하는 경우를 방지하기 위해 어노테이션이 붙은 메소드가 실행되기 전에 잠금 $lock이라는 개인 잠금 필드를 생성한다
  • lock 오브젝트를 자동으로  생성하므로, Synchronized를 손쉽게 사용할 수 있게 해준다.

@Builder

  • 빌더 패턴을 사용할 수 있도록 빌더API를 제공한다
  • private 이긴 하지만, @AllArgsConstructor를 기본적으로 적용한다.
  • 클래스보다는 사용자 정의 생성자 혹은 static 객체 생성 메소드에 사용하는 것을 권장한다.
  • @Singular : Collection 타입에 서넝ㄴ하게 되면 파라미터를 하나씩 추가할 수 있다.

@Log, @Slf4j

  • 로그를 남기기 위한 어노테이션이다.
  • 어노테이션을 클래스에 선언하면, log관련 static 메소드를 선언하지 않아도 된다.
정리
보통 @Getter, @Setter, @ToString, @Builder, @Log 정도만 많이 사용한다고 합니다.
@Data 보다는 코드가 길어지더라도 필요한 어노테이션만 선언하는 것을 권장합니다

 

 

출처
http://gre-eny.tistory.com/303
반응형

'BackEnd > Java' 카테고리의 다른 글

[Spring] Spring Security + jwt 사용  (0) 2022.07.23
[Thymeleaf] layout-dialect 사용하기  (0) 2022.07.22
SpringBoot MySQL & JPA 연동  (0) 2022.03.31
JAVA 버전이 변경 안될때 체크사항  (0) 2022.03.16
IntelliJ 설치  (0) 2022.03.15
반응형

JAVA설치 후 커맨드 창을 열어 해당 명령어를 입력하면, 자바 버전이 나오는데 본인이 설치한 버전과 다를 경우

해결 방법에 대해 안내합니다.

//명령어 입력
java -version

 

환경변수 설정
  1. 키보드 [Win+R] 단축키를 이용해 실행창을 연다. 
  2. [sysdm.cpl] 을 입력하고 [고급 탭]으로 이동한다.
  3. 환경변수 버튼을 클릭한다.
  4. 시스템 변수에 JAVA_HOME 의 경로가 정상적으로 잡혀 있는지 확인한다.
  5. 경로가 정상적이지 않다면 경로를 재설정 해준다.
  6. 시스템변수 -> Path의 경로를 추가한다 [ %JAVA_HOME%\bin ] ※bin까지 꼭 입력해야한다.
  7. 커맨드창을 열어 java -version으로 자바버전이 바뀌었는지 확인한다.
  8. 7번까지 진행하여도 자바 버전이 바뀌지 않았으면, 시스템변수 -> Path에 자바 경로가 다른것이 있는지 체크한다. 윈도우에서 java통합 설치를 진행하면 자동으로  C:\Program Files (x86)\Common Files\Oracle\Java|javapath 가 잡혀서 삭제 해주었다

감사합니다.

 

 

반응형

'BackEnd > Java' 카테고리의 다른 글

[Spring] Spring Security + jwt 사용  (0) 2022.07.23
[Thymeleaf] layout-dialect 사용하기  (0) 2022.07.22
SpringBoot MySQL & JPA 연동  (0) 2022.03.31
[IntelliJ] Lombok 설치 및 Lombok Annotation 정리  (0) 2022.03.16
IntelliJ 설치  (0) 2022.03.15
반응형
환경
  • 개발 Window11
  • Git
  • Github
  • Jenkins
  • RabbitMQ 3.9.12
  • Erlang 24.2
  • MySQL
설치

1. https://www.jetbrains.com/ko-kr/idea/download/#section=windows 링크로 이동하여 다운로드 합니다.

  1. Ultimate (라이센스 구독) 과 Community버전이 있으며 자신에게 맞는 버전을 이요하면 된다. (Ultimate버전은 30일 무료이다).

 

IntelliJ 설치화면

 

 

2. 설치경로 지정 후 [Next] 클릭

 

3. 설치 옵션 체크 후 [Next] 클릭

 

  1. Create Deskto Shortcut - 바로가기 생성
  2. Update Context Menu - 프로젝트로 폴더 열기 메뉴 추가
  3. Create Associations - 사용할 언어 확장자 선택
  4. Update PATH Variable - 윈도우 환경변수 자동 추가

[Next]로 넘기면 IntelliJ 설치가 완료 됩니다.

 

감사합니다.

 

 

 

 

반응형
반응형

var

  • 컴파일 시 해석
  • 선언 시 자료형을 선언해줘야함.

 

 

 

 

dynamic

  • 런타임 시 해석
  • object 형 과 비슷하여 선언 시 자료형을 선언해주지 않아도됌.
  • 런타임 시 에러가 발생하므로 try catch문을 잘 사용해야함
반응형

'BackEnd > C#' 카테고리의 다른 글

DataTable 데이터 중복 제거  (0) 2018.09.04
Newtonsoft.Json Nuget Console 설치  (3) 2017.03.31
반응형

.Net MVC솔루션 개발 중

 

Ajax를 [Async:true] 로 호출해도 프리징 현상이 일어나서 원인을 파악해보니,

 

Sesstion State를 사용하면 Session Access Lock으로 인해 Serialize하게 동작하는 것을 확인했다,

 

이를 위한 해결 방법으로는 Controller에 Attribute를 사용하는 방법이 있습니다.

 

1
[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
cs

 

APIController에서 Session을 사용할 수 있는데, 사용하기 위해서는 Global.asmx에 이부분을 입력 하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private const string _WebApiPrefix = "api";
private static string _WebApiExecutionPath = String.Format("~/{0}", _WebApiPrefix);
 
protected void Application_PostAuthorizeRequest()
{
    if (IsWebApiRequest())
    {
        HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.ReadOnly);
    }
    else
    {
        HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
    }
}
 
private static bool IsWebApiRequest()
{
    return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(_WebApiExecutionPath);
}
cs
[ APIUrl이 api/{Controller}/{action}일때는 ReadOnly 그외에는 Required ]

 

 

해당 소스에서  _WebApiPrefix변수와 Application_PostAuthorizeRequest 메소드를 이용해 세션 사용여부를 사용합니다.

 

HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required 가 Session을 읽기/쓰기사용하는 설정이고,

 

HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.ReadOnly가 Session을 읽기만 하는 설정입니다

 

위 변수와 WebApiConfig.cs 를 통해 원하는 용도에 맞게 API를 이용할 수 있습니다.

 

감사합니다.

 

 

 

반응형

'BackEnd > ASP .NET' 카테고리의 다른 글

[ASP.NET] WEB API에서 세션(SESSION) 사용하기  (1) 2017.04.10

+ Recent posts