CentOS7에서 Nginx 리버스 프록시 설정중 permission 에러가 발생했었다. 방화벽도 열어줬는데 뭐지? 하고 열심히 삽질한 결과 SELinux 이놈 때문이였다. SELinux에서 port를 제어하기 때문에 해당 port를 오픈해줘야했다. SELinux 란? Security Enhanced Linux 풀네임 그대로 과거 오픈소스인 리눅스의 보안 취약점을 보완하기 위한 것이다 SELinux 상태보기 sestatus 오픈된 port 확인하기 semanage port -l | grep http_port_t port 뚫기 semanage port -a -t http_port_t -p tcp 8080 서버에서 500에러를 뱉거나 nginx 로그파일에 "(13: Permission denied)"라는 문..

XXXtoOne 일 경우 기본 FetchType은 EAGER 이고 XXXtoMany 일 경우 FetchType은 LAZY이다. 비즈니스 로직에서 단순히 Member 정보만 사용하는데 Team을 함께 조회하면 아무리 연관관계가 걸려있다해도 손해이다. JPA는 이 문제를 지연로딩(LAZY)을 사용해서 해결한다. 즉시로딩 부터 살펴보자. 즉시로딩(FetchType.EAGER) Member.class @Entity public class Member { @Id @GeneratedValue private Long id; private String name; @ManyToOne(fetch = FetchType.EAGER) @JoinColumn private Team team; public Long getId() {..
p6spy를 사용하면 실행되는 db쿼리 파라미터까지 볼 수 있어서 개발 시에 아주 유용하게 쓰고있다. 배포시엔 enable-logging: false 설정하는 것을 잊지말자. // build.gradle implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.7.1' //application.yaml decorator: datasource: p6spy: enable-logging: true

RequestContextHolder는 Spring 컨텍스트에서 HttpServletRequest에 접근할 수 있게 도와준다. 따라서 이를 활용하면 HttpServletRequest를 사용하기 위해 request를 메소드 파라미터로 전달하지 않아도 된다. RequestContextHolder 원리 ThreadLocal을 사용해서 servlet이 호출되면 key,value (thread,HttpservletRequest)를 보관한다. 호출된 servlet과 동일한 thread내에서는 어느 곳에서든 같은 HttpServletRequest를 꺼내서 쓸수 있다. servlet이 종료 될 때 해당 thread를 key로 갖는 쌍을 제거한다. RequestContextHolder 메소드 currentRequestA..