2024. 4. 12. 18:51γBackend/Spring
νμ¬ μ§μΈ 3λΆκ³Ό ν¨κ» μ§ννκ³ μλ μ€νλ§ νλ‘μ νΈκ° μλ€.
GitHub - Tiketeer/Tiketeer-BE
Contribute to Tiketeer/Tiketeer-BE development by creating an account on GitHub.
github.com
νλ‘μ νΈ μ΄μ°½κΈ° μΈν μ νμ΄λ²λ€μ΄νΈ λ‘κ·Έ μ΅μ μ μλμ²λΌ κ°λ¨νκ²λ§ 쀬μλλ°, νλ‘μ νΈλ₯Ό μ§ν ν¨μ μμ΄ λλ²κΉ λͺ©μ μΌλ‘ DB μΈ‘ λ‘κ·Έλ₯Ό κΉλ€μ§μ λ λλ νμλ€μ λ‘κ·Έ μ 보μ λν λ§μ‘±λκ° κ·Έλ¦¬ λμ§ μμλ€. (μ μ νμν λ‘κ·Έκ° μλ€, λ‘κ·Έλ€μ΄ λμ μλ€μ΄μ¨λ€, λ‘κ·Έλ€μ΄ λ무 λ§μ΄ μ°νλ€... λ±)
# κΈ°μ‘΄ application.yml
spring.jpa.show-sql: true
spring.jpa.properties.hibernate.format_sql: true
logging.level.org.hibernate: debug
logging.level.org.hibernate.type.descriptor.sql.BasicBinder: trace
κ·Έλμ μ΄λ₯Ό ν΄μνκΈ° μν΄ λ‘κΉ μ΅μ λ€μ μ’ μ 리ν΄μΌκ² λ€κ³ μκ°νκ³ , μ΄λ₯Ό μν΄ νμ΄λ²λ€μ΄νΈ λ‘κΉ μ΅μ μ 리μμΉν λΆλΆλ€κ³Ό μ΅μ’ μ μΌλ‘ μ μ©ν μ΅μ λ€μ κΈ°λ‘, 곡μ νκΈ° μν΄ μ΄ κΈμ μμ±νμλ€.
(μ μ©ν λ‘κΉ μ΅μ λ§ νμΈνκ³ μΆμ κ²½μ°, κΈμ μ΅νλ¨μΌλ‘ 건λ λΈ κ²)
λ‘κΉ μ΅μ
1. show-sql: true
κΈ°μ‘΄μ μ¬μ©νλ μ΅μ μ΄λ€.
μ΄ μ΅μ μ μ΄μ©νλ©΄ μ€νλ§ νλ‘μ νΈ λ΄μμ Jpaλ₯Ό ν΅ν΄ DBλ‘ μ€νλ 쿼리λ€μ μλμ²λΌ λ‘κ·Έλ‘ νμΈν μ μλ€.
κ°λ°, ν μ€νΈ νκ²½μμ μ¬μ©ν΄λ΄μ§ν μ΅μ μΌλ‘ JPAκ° μΆμννλ DB μΈ‘ 쿼리λ₯Ό μ§μ μ μΌλ‘ νμΈν μ μμ΄ λλ²κΉ μ μ μ©νλ€.
νμ§λ§ μ€μ λ‘ μ΄λ₯Ό μ¬μ©νλ κ²μ κΆμ₯λμ§ μλλ°, κ·Έ μ΄μ λ ν΄λΉ μ΅μ μ΄ νλ‘μ νΈμ λ‘κΉ μ΅μ μ 무μν μ± κ³§λ°λ‘ νμ€ μΆλ ₯(Standard Output)μ ν΅ν΄ λ‘κ·Έλ₯Ό μΆλ ₯νκΈ° λλ¬Έμ΄λ€.
λ‘κ·Έκ° κ³§λ°λ‘ νμ€ μΆλ ₯μ ν΅ν΄ μΆλ ₯λ κ²½μ° λ°μν μ μλ λ¬Έμ λ μλμ κ°λ€.
- μΆλ ₯ν λ‘κ·Έλ₯Ό μ ν리μΌμ΄μ μ€ν 컨ν μ€νΈμ λ°λΌ λμ μΌλ‘ μ ννλ κ²μ΄ νλ€λ€. (λ‘κ·Έ λ 벨)
- λ‘κΉ μ΄λΌλ ν‘λ¨ κ΄μ¬μ¬μμ λ°μνλ λ€μν μꡬμ¬νλ€(ex. νμΌ μ°κΈ° μ μ± )μ νλμ ꡬν체(νλ μμν¬)λ₯Ό ν΅ν΄ μ μ΄ν μ μλ€.
λ°λΌμ ν΄λΉ μ΅μ μ μ¬μ©νλ κ²λ³΄λ€ μλ μ΅μ μ μ¬μ©νλ κ²μ΄ κΆμ₯λλ€.
logging.level.org.hibernate.SQL: {log_level}
2. properties.hibernate.format_sql: true
κΈ°μ‘΄μ μ¬μ©νλ μ΅μ μ΄λ€.
ν΄λΉ μ΅μ μ μ¬μ©ν κ²½μ°, show-sqlλ₯Ό(νΉμ μ΄λ₯Ό λ체νλ org.hibernate.SQL μ΅μ ) ν΅ν΄ μΆλ ₯λλ 쿼리λ€μ΄ 보기 μ’κ² μ€λ°κΏ λμ΄ μΆλ ₯λλ€.
μμμ 보μ¬μ€ μ€ν¬λ¦°μ·λ€μ μ¬μ€ μ΄λ―Έ μ΄ μ΅μ μ΄ μ μ©λ μνμ΄λ€. (μ μ©νμ§ μμ κ²½μ° μΏΌλ¦¬λ€μ΄ νμ€λ‘ μΆλ ₯λλ€.)
3. properties.hibernate.highlight_sql: true
μλ‘κ² μκ² λ μ΅μ μ΄λ€.
μ΄λ₯Ό μ¬μ©ν κ²½μ°, μΆλ ₯λλ SQL 쿼리 λ΄ ν€μλ(SELECT, FROM λ±)λ€μ΄ νμ΄λΌμ΄νΈ(μμΉ ) νμμ ν¨κ» μΆλ ₯λλ€.
μ¬μ©νμ λ μμλ μλμ κ°λ€.
λ€λ§ μ΄ μ΅μ μ IDEA, μ½μ νκ²½μμλ μ λμνλ, λ§μ½ ν μ€νΈ κ²°κ³Όλ₯Ό HTML ννμ 리ν¬νΈλ‘ λ³΄κ² λλ©΄ μ΄ λλ μλμ²λΌ μΆλ ₯λμ΄ λλ € κ°λ μ±μ΄ λλΉ μ§λ λ¨μ μ΄ μλ κ²μΌλ‘ 보μΈλ€.
4. properties.hibernate.generate_statistics: true
μλ‘κ² μκ²λ μ΅μ μ΄λ€.
μ΄λ₯Ό νμ±νν μ νλμ νΈλμμ μμ μ€νλλ 쿼리λ€μ λν κ°λ¨ν ν΅κ³λ€μ΄ μλμ κ°μ΄ μΆλ ₯λλ€.
ν΄λΉ μ΅μ μ νμ±νλ €λ©΄ μΆκ°μ μΌλ‘ μλ μ΅μ μ μΆκ°ν΄μ£Όμ΄μΌ νλ€.
org.hibernate.stat: {log_level}
μ΄ μ΅μ μ μ₯μ μ μ±λ₯ μ λ³λͺ©μ΄ λ°μνλ μ§μ μ νμΈνκΈ°κ° μ½λ€λ μ κ³Ό, μ°κΈ° μ§μ°μ ν΅ν λ°°μΉ μΏΌλ¦¬κ° μλλλ‘ λμνλμ§ νμΈνλλ° μ©μ΄νλ€λ μ μ΄λ€.
νΉν νμμ κ²½μ°μ, λ¨μ νμ΄λ²λ€μ΄νΈμμ μ§μνλ λ‘κ·Έλ‘λ μ€μ λ‘ λ°°μΉ μΏΌλ¦¬κ° μ€νλλμ§ νμΈνλ κ²μ΄ μ½μ§ μμλ° μ΄λ₯Ό μ¬μ©ν κ²½μ° κ·Έ λ¬Έμ κ° μ½κ² ν΄κ²°λλ€.
5. org.hibernate: {log_level}
κΈ°μ‘΄μ μ¬μ©νλ μ΅μ μ΄λ€.
ν΄λΉ μ΅μ μ μ¬μ©ν κ²½μ° νμ΄λ²λ€μ΄νΈμμ λ°μνλ λͺ¨λ λ‘κ·Έλ₯Ό(λ‘κ±°μμ org.hibernate.~ or o.h.~ λ‘ μΆλ ₯λλ λ‘κ·Έλ€) DEBUG λ λ²¨λ‘ μΆλ ₯νλ€.
μ΄ μ΅μ μ μ¬μ©ν κ²½μ°, κΈ°λ³Έμ μΌλ‘ λ‘κ·Έ μ°½μ΄ κ΅μ₯ν νμ±(?)ν΄μ§λ€. μ΄λ₯Ό ν΅νλ©΄ νμ΄λ²λ€μ΄νΈκ° μΆμν λ μ΄μ΄ μ΄λ©΄μμ μννλ μΌλ€μ΄ λλΆλΆ μΆλ ₯λμ΄ λλ²κΉ μ ν° λμμ΄ λμ§λ§, μ’ κ³Όνλ€κ³ λκ»΄μ§ μλ μλ€.
μλλ ν΄λΉ μ΅μ μ μΌ λ€ κ°λ¨ν ν μ€νΈ μ½λλ₯Ό μ€ννμ λ μΆλ ₯λλ λ‘κ·Έμ λλ΅μ μΈ μλ₯Ό μΈλ³Έ κ²μ΄λ€.
6. org.hibernate.SQL: {log_level}
μλ‘κ² μκ²λ μ΅μ μ΄λ€.
ν΄λΉ μ΅μ μ μμμ μ΄λ―Έ μΈκΈν 1. show-sql: true μ΅μ κ³Ό λμΌν λ‘κ·Έλ₯Ό μΆλ ₯νλ€. λ€λ§ μ΄ κ²½μ°μ μ ν리μΌμ΄μ λ΄ μ€μ λ λ‘κ±°λ₯Ό νμ©νλ λλλ‘μ΄λ©΄ μ΄ μ΅μ μ μ¬μ©νμ.
7. org.hibernate.type.descriptor.sql.BasicBinder: {log_level}
κΈ°μ‘΄μ μ¬μ©νλ μ΅μ μ΄λ€.
ν΄λΉ μ΅μ μ μν μ μΆλ ₯λλ SQL λ‘κ·Έμ μ€μ λ‘ μ΄λ€ κ°λ€μ΄ λ°μΈλ©λκ³ μλμ§ ν¨κ» μΆλ ₯νλ μν μ΄λ€. μ΄ μ΅μ μ νμ±νν κ²½μ° λλ²κΉ μ ν° λμμ΄ λ μ μλ€.
νμ§λ§ μ΄λ² κΈ°νμ νμΈν κ²°κ³Ό, μ΄μνκ²λ μ°λ¦¬ νλ‘μ νΈμμλ λμνμ§ μμλ€. κ·Έ μ΄μ λ νμ΄λ²λ€μ΄νΈ 5.X λ²μ μμ Deprecated λμκΈ° λλ¬Έ.... (νμ¬ νλ‘μ νΈμ νμ΄λ²λ€μ΄νΈ λ²μ μ 6.X)
λ°λΌμ ν΄λΉ μ΅μ λμ μλμ μ΅μ μ νμ©ν μ μλ€.
org.hibernate.orm.jdbc.bind: {log_level}
μ΄λ₯Ό μ¬μ©ν κ²½μ°, μλμ²λΌ μΏΌλ¦¬κ° μΆλ ₯λ μ΄νμ 곧λ°λ‘ μ΄λ€ νλΌλ―Έν°λ€μ΄ μ€μ λ‘ λ°μΈλ© λλμ§ νμΈμ΄ κ°λ₯νλ€.
8. org.hibernate.orm.jdbc.bind: {log_level}
μλ‘κ² μκ²λ μ΅μ .
νμ΄λ²λ€μ΄νΈ 6λ²μ μ΄μμμ 쿼리 νλΌλ―Έν°λ₯Ό μΆλ ₯νκΈ° μν΄μλ ν΄λΉ μ΅μ μ μ¬μ©ν΄μΌ νλ€.
λ°λ‘ μ§μ 7.org.hibernate.type.descriptor.sql.BasicBinder μ±ν°μμ μ΄λ―Έ μ€λͺ νμμΌλ―λ‘ μ΄ν μλ΅.
9. org.hibernate.SQL_SLOW
μλ‘κ² μκ²λ μ΅μ .
νμ΄λ²λ€μ΄νΈ 5.4.5 λ²μ μ΄μλΆν° μ¬μ©ν μ μμΌλ©°, μ΄ μ΅μ μ νμ±νν κ²½μ° μ ν리μΌμ΄μ μμ μ€νλ λλ¦° μΏΌλ¦¬κ° λ‘κ·Έμ μΆλ ₯λλ€.
μ΄ μ΅μ μ μΆκ°νκΈ° μν΄μλ μλ μ΅μ μ λν μΆκ°κ° νμμ μ΄λ€.
spring.jpa.properties.hibernate.session.events.log.LOG_QUERIES_SLOWER_THAN_MS: {λλ¦° 쿼리 νλ¨ κΈ°μ€ ms}
μ΄ μ΅μ μμ μ€μ ν msλ₯Ό μ΄κ³Όνλ 쿼리μ λν΄μλ§ λ‘κ·Έκ° μΆλ ₯λλ€. μ΄ λ μ€ν μκ°μ μΈ‘μ νλ κΈ°μ€μ μ€μ μΏΌλ¦¬κ° μ€νλ μκ° λ§μ μΈ‘μ .
κ²°λ‘ (μ€μ μ μ© λ‘κΉ μ΅μ )
1. Test μ© (λ³Έλ¬Έμμ λ€λ£¬ λ΄μ©λ€λ§ μμ±)
# application.yml
spring:
jpa:
properties:
hibernate:
format_sql: true
generate_statistics: true
session.events.log.LOG_QUERIES_SLOWER_THAN_MS: 300
...
logging:
level:
org.hibernate.SQL: DEBUG
org.hibernate.orm.jdbc.bind: TRACE
org.hibernate.SQL_SLOW: INFO
org.hibernate.stat: DEBUG
...
ν μ€νΈμ νμ©ν μ€μ νμΌμ μμ κ°μ΄ ꡬμ±ν΄μ£Όμλ€. μ¬μ΄ λλ²κΉ μ μν΄ κ±°μ λͺ¨λ λ‘κΉ μ νμ±ν νμμΌλ μλ λκ°μ μ΅μ μ λΉνμ±ννλ€.
- org.hibernate: {log_level}
- properties.hibernate.highlight_sql: true
κ·Έ μ΄μ λ, μ°μ μ μμ μ΅μ μ λλ²κΉ μ ν¬κ² νμ©νμ§ μλ λ‘κ·Έλ€λ λ무 λ§μ΄ μ°νλ€λ λ¨μ μ΄ μμλ€. νμλ€κ³Όμ λλ²κΉ κ³Όμ μ λμ΄μΌλ³΄λ©΄, ν΄λΉ μ΅μ μ ν΅ν΄ μΆλ ₯λλ λ‘κ·Έλ€λ³΄λ€λ μ€μ μ΄λ€ 쿼리μ μ΄λ€ νλΌλ―Έν°λ‘ μΏΌλ¦¬κ° μ€νλλμ§μ λν org.springframework.orm, org.springframework.tracsaction μ΅μ μ ν΅ν λ‘κ·Έλ€μ λ λ§μ΄ μμ‘΄νμκΈ° λλ¬Έμ μ΄λ₯Ό κ³Όκ°ν μμ νμλ€.
λν sql νμ΄λΌμ΄ν μ΅μ μ Html 리ν¬νΈμμ κ°λ μ±μ λ무λ λ¨μ΄λ¨λ¦¬λ λ¬Έμ λλ¬Έμ ν μ€νΈ νκ²½μμλ μΆκ°νμ§ μμλ€.
2. Dev μ©
# application.yml
spring:
jpa:
properties:
hibernate:
format_sql: true
highlight_sql: true
generate_statistics: true
session.events.log.LOG_QUERIES_SLOWER_THAN_MS: 300
...
logging:
level:
org.hibernate.SQL: DEBUG
org.hibernate.orm.jdbc.bind: TRACE
org.hibernate.SQL_SLOW: INFO
org.hibernate.stat: DEBUG
...
κ°λ° νκ²½μ© μ€μ μ μμ κ°μ΄ ν΄μ£Όμλ€. ν μ€νΈ μ© μ€μ μμ highlight_sql μ΅μ λ§μ μΆκ°ν΄μ£Όμλ€.
3. Prod μ©
# application.yml
logging:
level:
org.hibernate: ERROR
...
μμ§ νλ‘λμ νκ²½μ ꡬμ±νμ§λ μμμΌλ, ꡬμ±νκ² λλ€λ©΄ μμ κ°μ΄ ꡬμ±ν κ² κ°λ€.
μ€μ νκ²½μμλ κΌ νμν λ‘κ·Έλ§μ μΆλ ₯ν΄μΌνκΈ° λλ¬Έμ νμ΄λ²λ€μ΄νΈ λ΄μμ λ°μνλ μλ¬ μ΄μμ λ‘κ·Έλ€λ§ μΆλ ₯νλ κ²μ΄ νλΉνλ€κ³ μκ°νλ€.
References
Logging Guide for Hibernate 4, 5 & 6 - Use the right config for dev and prod
How should you configure your Hibernate logging to find performance issues during development? What is the best configuration for production?
thorben-janssen.com
Hibernate ORM 6.1.7.Final User Guide
Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat
docs.jboss.org