1. Logback
Logback은 Java 기반의 로깅 프레임워크로, SLF4J (Simple Logging Facade for Java)의 Native 구현체이다.
Log4j를 기반으로 개발되었으며, 더 빠른 구현과 더 적은 메모리 점유율, 그리고 더 나은 내부 아키텍처를 제공한다.
💡 Logback의 주요 모듈
- logback-core
다른 두 모듈의 기반이 되는 모듈 - logback-classic
log4j의 개선된 버전으로, SLF4J API를 구현 - logback-access
Servlet 컨테이너와 통합되어 HTTP 엑세스 로그 기능 제공
💡 Logback의 주요 특징
- 빠른 구현 속도와 광범위한 진단 옵션
- 자동 재로딩 Configuration파일
- 로그 파일 자동 압축
- 조건부 처리를 위한 필터 지원
📌 Logback 사용을 위한 주요 메소드와 설정
메소드/설정 | 설명 |
<appender> | 로그 이벤트의 출력 대상과 형식을 정의 |
<logger> | 로깅을 수행할 클래스나 패키지를 지정 |
<root> | 모든 <logger>의 기본이 되는 루트 로거를 설정 |
addAppender() | 로거에 appender를 추가 |
setLevel() | 로거의 로그 레벨을 설정 |
💻 예시 코드
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
LogBack을 통한 효율적인 로그 관리
로그 관리의 필요성을 느낀 필자는 Slf4j의 LogBack을 사용해서 문제를 해결한다..!
velog.io
- 참고 : pgmjun.log
Logback 이란?
Logback Logback이란? Logback은 Java에서 가장 많이 사용 되었던 로깅 라이브러리인 log4j의 후속버전이며, log4j를 설계한 Ceki Gulgu에 의해 설계되었습니다. logback은 새롭게 작성된 logger가 아니라, 오랫동
agileryuhaeul.tistory.com
- 참고 : agileryuhaeul
2. Log Level
Log Level은 로깅 프레임워크에서 로그 메세지의 중요도를 나타내는 지표이다.
Log Level을 사용하면 애플리케이션의 다양한 부분에서 서로 다른 상세도로 로그를 생성할 수 있다.
🚀 일반적으로 사용되는 로그 레벨 (가장 낮은 레벨부터)
- TRACE
가장 상세한 정보를 제공, 주로 개발 단계에서 사용 - DEBUG
문제 진단에 유용한 세부 정보를 제공 - INFO
애플리케이션의 일반적인 작동 정보를 제공 - WARN
잠재적인 문제를 나타내지만, 애플리케이션은 계속 실행 가능 - ERROR
오류 이벤트를 나타내며, 애플리케이션의 일부 기능이 작동하지 않을 수 있음 - FATAL
애플리케이션이 중단될 수 있는 매우 심각한 오류 이벤트를 나타냄
로그 레벨을 설정하면 해당 레벨 이상의 모든 로그 메세지가 기록된다.
(ex : INFO 레벨로 설정하면 INFO, WARN, ERROR, FATAL 레벨의 메세지가 기록된다.)
📌 Log Level 설정 및 사용 메소드
메소드 | 설명 |
setLevel() | 로거의 로그 레벨을 설정 |
isTraceEnabled() | TRACE 레벨이 활성화되었는지 확인 |
isDebugEnabled() | DEBUG 레벨이 활성화되었는지 확인 |
isInfoEnabled() | INFO 레벨이 활성화되었는지 확인 |
trace() | TRACE 레벨 로그 메세지 기록 |
debug() | DEBUG 레벨 로그 메세지 기록 |
info() | INFO 레벨 로그 메세지 기록 |
warn() | WARN 레벨 로그 메세지 기록 |
error() | ERROR 레벨 로그 메세지 기록 |
💻 예시 코드
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogLevelExample {
private static final Logger logger = LoggerFactory.getLogger(LogLevelExample.class);
public void logMessages() {
logger.trace("This is a TRACE message");
logger.debug("This is a DEBUG message");
logger.info("This is an INFO message");
logger.warn("This is a WARN message");
logger.error("This is an ERROR message");
}
}
로그 레벨(Log Level)
무분별한 로그로 로그확인이 어렵지 않게 하기 위해 로그레벨을 사용한다.TRACE > DEBUG > INFO > WARN > ERROR > FATALTRACE: 추적레벨은 DEBUG보다 좀 더 상세한 정보를 나타낸다.DEBUG: 프로그램을 디버깅하기
velog.io
- 참고 : 빼-엠.log
3. @ManyToOne, @OneToMany
JPA (Java Persistence API)에서 사용되는 어노테이션으로, 엔티티 간의 관계를 정의하는 데 사용된다.
1️⃣ @ManyToOne
- 다대일(N:1) 관계를 나타낸다.
- 여러 개의 엔티티가 하나의 엔티티를 참조할 때 사용한다.
- 주로 외래 키를 가지는 쪽의 엔티티에 적용한다.
2️⃣ @OneToMany
- 일대다(1:N) 관계를 나타낸다.
- 하나의 엔티티가 여러 개의 엔티티를 참조할 때 사용한다.
- 주로 외래 키를 가지지 않는 쪽의 엔티티에 적용한다.
- 기본적으로 지연 로딩(LAZY)을 사용한다.
💡 주요 속성
속성 | 설명 |
cascade | 연관된 엔티티에 대한 영속성 전이 옵션 설정 |
fetch | 관계 에닡티의 로딩 전략 설정 (EAGER 또는 LAZY) |
mappedBy | 양방향 관계에서 주인이 아닌 쪽에 설정, 관계의 주인 필드를 지정 |
orphanRemoval | 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제할지 설정 |
💻 예시 코드
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
private List<Employee> employees = new ArrayList<>();
}
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
}
[JPA] @ManyToOne, @OneToMany 이해하기
테이블 구조 지난 포스팅에 이어 @ManyToOne과 @OneToMany에 대해서 예시 코드를 작성한다. 은행 서비스에서 사용자(User)가 1개 이상의 계좌(Account)를 가질수 있다면 아래처럼 물리 테이블을 설계할것
soojong.tistory.com
- 참고 : soojong
4. @JoinColumn
JPA에서 외래키를 매핑할 때 사용하는 어노테이션이다. 주로 @ManyToOne이나 @OneToMany관계에서 사용되며,
외래키를 가지는 엔티티 쪽에 적용한다.
💡 @JoinColumn의 주요 기능
- 외래 키 컬럼의 이름을 지정한다.
- 외래 키 제약 조건을 설정할 수 있다.
- 외래 키 컬럼의 널(null) 허용 여부를 설정할 수 있다.
@JoinColumn을 사용하지 않으면, JPA는 기본 명명 규칙에 따라 외래 키 컬럼을 생성한다.
하지만 @JoinColumn을 사용하면 이를 명시적으로 제어할 수 있다.
💡 주요 속성
속성 | 설명 |
name | 매핑할 외래 키 컬럼의 이름 |
referencedColumnName | 외래 키가 참조하는 대상 테이블의 컬럼명 |
nullable | 외래 키 컬럼의 null 허용 여부 (기본값 : true) |
unique | 유니크 제약조건 설정 여부 |
insertable | 엔티티 저장 시 이 필드도 같이 저장할지 여부 |
updatable | 엔티티 수정 시 이 필드도 같이 수정할지 여부 |
💻 예시 코드
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "customer_id", nullable = false)
private Customer customer;
// 기타 필드 및 메서드
}
@Entity
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "customer")
private List<Order> orders = new ArrayList<>();
// 기타 필드 및 메서드
}
[JPA] @JoinColumn 파헤치기 (feat. JPA 연관관계별 사용)
✌🏻 0. 들어가기 전 JPA 강의 중에 @JoinColumn을 마스터하면 JPA 연관관계를 어느정도는 다 알 수 있다고 들었다. 그래서, 여러 JPA 개념 중에 @JoinColumn에 대해 파헤쳐보면서 JPA 연관관계를 이해해보
ksh-coding.tistory.com
- 참고 : ksh-coding
5. Native SQL
Native SQL은 JPA에서 제공하는 기능으로, 데이터베이스의 고유한 SQL을 직접 사용할 수 있게 해 준다.
JPQL (Java Persistence Query Language)이나 Criteria API로 표현하기 어려운 복잡한 쿼리나
데이터베이스 특정 기능을 사용해야 할 때 유용하다.
💡 Native SQL의 주요 특징
- 데이터베이스에 최적화된 쿼리를 작성할 수 있다.
- 데이터베이스 종속적인 함수나 문법을 사용할 수 있다.
- JPA가 지원하지 않는 특수한 쿼리를 실행할 수 있다.
- 성능 최적화가 필요한 경우 유용할 수 있다.
하지만 Native SQL은 데이터베이스 종속성을 가지게 되므로,
데이터베이스를 변경할 경우 쿼리도 함께 수정해야 할 수 있다.
📌 Native SQL 사용을 위한 주요 메소드
메소드 | 설명 |
createNativeQuery() | Native SQL 쿼리를 생성 |
setParameter() | 쿼리의 파라미터 값을 설정 |
getResultList() | 결과를 리스트로 반환 |
getSingleResult() | 단일 결과를 반환 |
executeUpdate() | UPDATE, DELETE 같은 수정 쿼리 실행 |
💻 예시 코드
@PersistenceContext
private EntityManager entityManager;
public List<Object[]> findOrdersByCustomer(String customerName) {
String sql = "SELECT o.id, o.order_date, c.name " +
"FROM orders o " +
"JOIN customers c ON o.customer_id = c.id " +
"WHERE c.name = :customerName";
Query query = entityManager.createNativeQuery(sql);
query.setParameter("customerName", customerName);
return query.getResultList();
}
public int updateOrderStatus(Long orderId, String newStatus) {
String sql = "UPDATE orders SET status = :newStatus WHERE id = :orderId";
Query query = entityManager.createNativeQuery(sql);
query.setParameter("newStatus", newStatus);
query.setParameter("orderId", orderId);
return query.executeUpdate();
}
[JPA] 객체지향 쿼리 언어 - 네이티브 쿼리
이전 게시글 [JPA] 객체지향 쿼리 언어 - 소개 [JPA] 객체지향 쿼리 언어 - JPQL 기초 [JPA] 객체지향 쿼리 언어 - JPQL 조인 [JPA] 객체지향 쿼리 언어 - JPQL 심화 [JPA] 객체지향 쿼리 언어 - QueryDSL
taegyunwoo.github.io
- 참고 : joyhyonie.recipe
네이티브 쿼리 (Native Query)
💁♀️ 네이티브 쿼리란, SQL을 개발자가 직접 정의해서 사용할 수 있도록 해주는 수동모드
velog.io
- 참고 : taegyunwoo.github.io
'에이콘아카데미 회고 > 5회차) 자바기반 풀스택 개발자 양성과정' 카테고리의 다른 글
Spring, Spring Boot) 60번째 회고 (0) | 2024.07.12 |
---|---|
Spring, Spring Boot) 59번째 회고 (0) | 2024.07.12 |
Spring, Spring Boot) 57번째 회고 (0) | 2024.07.09 |
Spring, Spring Boot) 56번째 회고 (0) | 2024.07.09 |
Spring, Spring Boot) 55번째 회고 (0) | 2024.07.06 |