inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

업데이트 고견 구합니다.

2700

아리마

작성한 질문수 75

1

영한님 안녕하세요~ 오늘도 또 하나의 질문을 들고 왔습니다.

예전 MyBatis 방식에서는 보통 수정 처리의 경우, 업데이트 문 한번으로 처리가 가능했는데요.

(내가 수정하고자 하는 일부 항목들만 정의된 Update SQL 문 작성)

JPA 방식에서는 Find 를 먼저 하지 않고 바로 업데이트 하기에는 어려움이 있는 듯 합니다.

예를 들어 Member 객체에 패스워드가 포함되어 있는데 패스워드만 수정을 해야 되는 경우라면

MyBatis 방식에서는 별도의 select 없이 패스워드만 update 를 하면 됐었는데

JPA 에서는 Find 를 통해 객체에 초기셋팅을 한번 한 뒤에 @DynamicUpdate 활용해야

Password 만 변경되는  SQL 을 수행시킬 수가 있는 거 같습니다.

즉, Update 를 위해서는 항상 Select 절이 따라 붙어야 한다는 건데 JPA 장점을 위해 이런 부분은 감수해야 되는 부분이라고

생각해야 되겠죠?? 

spring-boot JPA java spring

답변 1

12

김영한

안녕하세요 아리마님^^

2가지 포인트가 있네요. 둘다 성능 때문에 사실 고민을 하시는 거구요. 

1. JPA에서 Select 없이 Update만 사용

-> 정말 필요하면 JPA에서 벌크 업데이트를 사용하면 됩니다. (단건도 가능합니다.) 하지만 이런 비즈니스 로직들은 전체 애플리케이션 성능에 주는 영향도가 미비합니다. 암달의 법칙을 생각하면, 이런 부분은 성능 보다는 유지보수성을 고민하는 것이 더 나은 선택이지요. 특히 단순 select 쿼리를 pk로 찍어서 조회하는 것이라면 더더욱 성능에 영향을 주는 것이 미비합니다. 실무에서 정말 고통스러운 상황은 시간이 올래 걸리는 복잡한 쿼리나 순간 많은 write가 일어나는 것 등이지요.

2. JPA에서 변경되는 컬럼만 Update 쿼리 동적으로 사용

-> 흥미롭게도 JPA는 애플리케이션 로딩 시점에 PrepareStatement 스타일로 해당 엔티티의 UPDATE 쿼리를 만들어 둡니다. 그래서 성능만 생각하면 컬럼에 값을 다 넘기는 것이나 하나만 동적으로 만들어서 넘기는 것이나 크게 차이가 나지 않습니다. 상황에 따라 다르겠지만, 오히려 전체 컬럼을 하나의 PrepareStatement 스타일의 SQL을 반복해서 사용하는게, 더 속도가 빠를 수도 있습니다. 물론 컬럼이 너무 많거나, 길이가 너무 길거나, 데이터가 너무 크다면 상황이 달라질 수 있습니다. 하지만 그만큼 크다면 이미 테이블을 분할했겠지요.

여기서 핵심은 이런 단순하게 엔티티 하나를 조회해서 사용하는 핵심 비즈니스 로직들은 전체 애플리케이션 성능에 크게 영향을 주지 않습니다. 대부분 단순 쿼리들이니까요^^ 성능 때문에 우리를 고통스럽게 하는 것은, 잘 인덱스 처리를 해야 하는 복잡한 쿼리들이지요.

결국 유지보수 관점에서 짜잘한 성능은 포기하고, 진짜 중요한 복잡한 조회 성능에 포인트를 맞추는 것이 JPA를 잘 활용하는 방법이라 볼 수 있습니다.

감사합니다^^!

1

Son원철

캬 설명 감사합니다 : >

강의 관련 외 질문입니다.

0

64

2

SpringBoot4 + Hibernate7 모듈 등록 방법 공유

0

85

1

BeanCreationException

0

86

3

Update 후 UpdateMemberResponse 매핑할 때

0

46

1

트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?

0

97

2

페이징 + 검색조건 관련해서 질문드립니다.

0

70

1

Query Dsl Q파일 질문입니다.

0

81

1

루트 쿼리라는것은

0

58

1

메서드를 분리하는 기준

0

61

1

findAllWithMemberDelivery 메서드 질문드립니다.

0

108

3

연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략

0

83

2

fetch join과 영속화와 OSIV의 관계

0

83

2

Distinct 사용 전 결과에 대한 의문

0

113

2

레포지토리 계층에서의 트랜잭션에 대한 의문

0

55

1

영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.

0

77

2

dto 필드 속 엔티티 여부

0

58

1

뷰템플릿 사용 시

0

76

2

Result 클래스 관련 질문

0

56

1

@PostConstruct 프록시 관련 질문드립니다

0

85

1

DTO 대신 Form 사용은 안되나요?

0

133

1

OSIV ON 상태일 때

0

95

1

fetch join VS fetch join 페이징 궁금증

0

179

2

양방향 연관관계 알아보는 법?

0

104

1

16강 17강 간단 정리 이게 맞을까요 ?

0

165

2