2024. 4. 12. 18:51γBackend/Spring
νμ¬ μ§μΈ 3λΆκ³Ό ν¨κ» μ§ννκ³ μλ μ€νλ§ νλ‘μ νΈκ° μλ€.
νλ‘μ νΈ μ΄μ°½κΈ° μΈν μ νμ΄λ²λ€μ΄νΈ λ‘κ·Έ μ΅μ μ μλμ²λΌ κ°λ¨νκ²λ§ 쀬μλλ°, νλ‘μ νΈλ₯Ό μ§ν ν¨μ μμ΄ λλ²κΉ λͺ©μ μΌλ‘ 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