Life Developer
인생 개발자
Developer (136)
[JPA]@NoArgsConstructor

@NoArgsConstructor(access = AccessLevel.PRIVATE)

를 클래스 위에 정의해주면

 

private Class명(){ }

 

처럼 생성자를 protected으로 만든다는 의미이다.

 

JPA에서 protected를 사용하면 걍 쓰지말란 얘기다.

  Comments,     Trackbacks
[JPA실전]memory로 테스트하기

테스트할때 메모리에 테이블 만들어서 테스트 할수 있다.

 

그리고 일단 test 에 resources 폴더를 만들어서 

 

이렇게 yml 파일을 주면 main의 resources 보다 우선적으로 읽어서 test할때는 저 yml 파일을 읽는다.

 

그래서 yml 파일의 내용을 맘대로 바꿔서 테스트 할수있다.

 

예를 들어 url이라던지?

 

 

그런데 신기한건 Spring Boot 에서 아래에서 연한 글씨의 코드를 다 빼고 실행하면

 

Spring Boot 자체적으로 메모리로 실행되게끔 디폴트가 되어있어서 메모리로 돈다.

 

spring:
datasource:
url: jdbc:h2:mem:test
username: sa
password:
driver-class-name: org.h2.Driver

jpa:

hibernate:
ddl-auto: create
properties:

hibernate:
# show_sql: true
format_sql: true


logging:
level:
org.hibernate.SQL: debug
org.hibernate.type: trace

 

 

심지어 알아서 url도 알아서 만들어서  실행해준다.ㅡㅡ

 

 

개쩐다

  Comments,     Trackbacks
[JPA실전]@RequiredArgsConstructor - EntityManager에 사용하기

@RequiredArgsConstructor 를 Repository에도 사용할수있다.

 

===================================================

처음에 이렇게 되어있는것을

 

@PersistenceContext
private EntityManager em;

public MemberRepository(EntityManager em) {
this.em = em;
}

 

 

===================================================

 

이렇게 바꿀수가 있고,

 

private EntityManager em;

@Autowired
public MemberRepository(EntityManager em) {
this.em = em;
}

 

===================================================

 

또 다시 위에 코드를 이렇게 바꿀수가 있다.

 

 

@Repository
@RequiredArgsConstructor
public class MemberRepository {

private final EntityManager em;

public void save(Member member) {
em.persist(member);
}

 

이게 되는 이유는 Spring Boot에서는 EntityManager는 @PersistenceContext 를 사용하여 관리가 되는데

 

@Autowired 를 사용해도 똑같아서 가능한것이다.

 

Spring Boot에서만 이렇게 사용할수 있다는것.

  Comments,     Trackbacks
[JPA실전]@RequiredArgsConstructor-final 변수들을 생성자로

@RequiredArgsConstructor를 사용하면 이 클래스의 멤버변수 중 final로 선언된 것만 

 

찾아서 모두 생성자에 박아버린다.

 

public MemberService(Member Repository memberRepository){

            this.memberRepository = memberRepository;

}

 

이것은 이렇게 자동으로 생긴다는 것이지 입력하는게 아니다.

 

@RequiredArgsConstructor 쓰면 자동으로 생성자가 저렇게 만들어진다는 거다.

 

setter로 주입받아도 되고 생성자를 그냥 AutoWired로 받아도 된다.

 

근데 이게 제일 안전하다.

 

 

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {

private final MemberRepository memberRepository;

 

public MemberService(Member Repository memberRepository){

            this.memberRepository = memberRepository;

}

//가입
@Transactional
public Long join(Member member) {
validateDuplicateMember(member);
memberRepository.save(member);
return member.getId();
}

private void validateDuplicateMember(Member member) {
List<Member> findMembers = memberRepository.findByName(member.getName());

if (!findMembers.isEmpty()) {
throw new IllegalStateException("이미 존재하는 회원입니다");
}
}

//회원 전체 조회
public List<Member> findMembers() {
return memberRepository.findAll();
}

//회원 단건 조회
public Member findOne(Long memberId) {
return memberRepository.findOne(memberId);
}
}

  Comments,     Trackbacks
[JPA실전]파라미터 로그 표시

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-devtools'
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

  Comments,     Trackbacks
[JPA실전]Spring-boot에서 EntityManager 정의

스프링부트가 다 알아서 해준다.

 

@PersistenceContext 만 해주면 끝.

 

@Repository
public class MemberRepository {

@PersistenceContext
private EntityManager em
;

public Long save(Member member) {
em.persist(member);

return member.getId();
}

public Member find(Long id) {
return em.find(Member.class, id);
}
}

'Developer' 카테고리의 다른 글

[JPA실전]@RequiredArgsConstructor-final 변수들을 생성자로  (0) 2020.09.28
[JPA실전]파라미터 로그 표시  (0) 2020.09.28
[JPA실전]devtools dependency  (0) 2020.09.28
[JPA실전]lombok 다운  (0) 2020.09.28
[JPA실전]시작  (0) 2020.09.28
  Comments,     Trackbacks
[JPA실전]devtools dependency

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-devtools'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

 

 

 

'Developer' 카테고리의 다른 글

[JPA실전]파라미터 로그 표시  (0) 2020.09.28
[JPA실전]Spring-boot에서 EntityManager 정의  (0) 2020.09.28
[JPA실전]lombok 다운  (0) 2020.09.28
[JPA실전]시작  (0) 2020.09.28
[JPA]벌크연산  (0) 2020.09.23
  Comments,     Trackbacks
[JPA실전]lombok 다운

 

 

테스트

 

 

@Getter
@Setter
public class Hello {
private String data;
}

 

 

 

@SpringBootApplication
public class JpashopApplication {

public static void main(String[] args) {
SpringApplication.run(JpashopApplication.class, args);

Hello hello = new Hello();
hello.setData("123");
String data = hello.getData()
;
}

}

'Developer' 카테고리의 다른 글

[JPA실전]Spring-boot에서 EntityManager 정의  (0) 2020.09.28
[JPA실전]devtools dependency  (0) 2020.09.28
[JPA실전]시작  (0) 2020.09.28
[JPA]벌크연산  (0) 2020.09.23
[JPA]JPQL-Named쿼리  (0) 2020.09.22
  Comments,     Trackbacks