본문 바로가기

Dev

(53)
API 최적화1 - N + 1 문제, Lazy 메커니즘, 패치조인 N + 1 문제 Ex) 주문내역 엔티티는 회원 엔티티와 상품정보 엔티티 두개를 가지고 있다고 해보자 이 때, 주문내역 엔티티를 조회하면 어떻게 될까? 만약 3개의 주문내역이 있다고 생각해보자 그렇다면 결과는 3개가 나와야한다. 즉, 조회된 엔티티의 개수(N)만큼 추가적인 쿼리가 발생하는 문제를 뜻한다. 주문내역 엔티티를 구하기 위한 질의를 던진다. 주문내역에 회원 엔티티를 구하기 위한 질의를 던진다. 상품정보 엔티티를 구하기 위한 질의를 던진다. 지금 주문 내역 엔티티를 구하기 위해 쿼리가 2개가 더 날아갔다. 이것이 1 + N 문제이다. 하나의 쿼리면 될 것을 몇개나 더 날린다. 그리고 주문내역이 3개 있으므로 이 엔티티는 무려 7개의 쿼리를 날려야한다. 단순히 생각해도 네트워크 통신이 많다. 왜 이럴..
SQL - 날짜 출력 방법 Specifier Description Example 1 %Y 연도(year): 4자리 표현 2021 2 %y 연도(year): 뒤에서 2자리 표현 21 3 %a 요일(weekday): 이름 줄임표현 Mon, Tue, Wed, ... 4 %W 요일(weekday): 이름 Sunday, ..., Saturday 5 %w 요일(weekday): 숫자 활용 0 = Sunday, ... , 6 = Saturday 6 %b 월(month): 이름 줄임표현 Jan, Feb, Mar, ... 7 %M 월(month): 이름 January, February, ..., December 8 %c 월(month): 숫자 표기(자릿수 고정 X) 0, 1, 2, ..., 12 9 %m 월(month): 숫자 표기(자릿수 2개로..
Spring Boot - 로그를 남기는 법 : @SLF4J 로깅에 대한 추상 레이어를 제공하는 인터페이스의 모음. 1. Log Level Trace Debug Info Warn Error Trace O O O O O Debug X O O O O Info X X O O O Warn X X X O O Error X X X X O Trace : 디버그보다 좀 더 상세한 정보를 나타냄 Debug : 프로그램을 디버깅하기 위한 정보 지정 Info : 상태변경과 같은 정보성 메세지를 나타냄 Warn : 처리가능한 문제, 향후 시스템 에러의 원인이 될 수 있는 경고성 메세지를 나타냄 Error : 요청을 처리하는 중 문제가 발생한 경우 import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Slf4jSam..
SSR과 CSR CSR : 클라이언트 사이드 렌더링 웹사이트에 접속했을 때, 웹 사이트를 보여주기 위한 과정을 렌더링이라고 하는데 CSR은 렌더링이 클라이언트 측에서 이루어지는 것을 뜻한다. 즉 서버는 요청을 받으면 클라이언트에 HTML과 JS를 보내고 클라이언트가 렌더링을 시작한다. 1. 유저가 요청을 보냄 2. CDN이 HTML 파일과 js로 접근할 수 있는 링크를 클라이언트로 보냄 - cdn이란 엔드 유저의 요청에 물리적으로 가까운 서버에서 요청에 응답하는 방식 3. 클라이언트는 HTML과 js를 다운로드 이 때 유저는 아무것도 볼 수 없음 4. 브라우저가 js 다운로드 5. js가 동작함 api를 콜하고 유저는 플레이스홀더를 보게됨. 플레이스 홀더란 문자나 이미지가 들어가기 전 임시로 표시해주는 문구나 이미지를 ..
믹스드 콘텐츠(Mixed Content)로 인한 보안 문제 믹스 콘텐츠란 만약 웹 사이트에서 HTTP 방식으로 이미지를 불러오거나 영상을 불러올 때 https 방식과 http 방식이 섞여있는 것을 말한다. 최근 크롬과 파이어폭스의 경우는 https가 아니면 경고하고 로드하지 않는다. HTTPS의 약화 - 보안되지 않는 프로토콜을 사용할 경우 네트워크를 도청하고 양자간 통신을 보거나 수정하는 수단인 중간자 공격에 취약하므로 전체 페이지의 보안이 약화된다. 이 때 공격자는 리소스를 사용해 페이지를 완전히 제어할 수 있기 때문에 아에 사전에 HTTP:// 프로토콜을 차단해버리는 방식이다. 쉬운 해결 방법은 https:// 로 소스를 변경하는 것이다.
Spring Boot 외부 파일 경로 설정 Spring Boot 외부 파일 경로 @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry){ String resourcePath = "file:///TistoryImages/"; String connectPath = "/image/{subfolder}/**"; registry.addResourceHandler(connectPath) .addResourceLocations(resourcePath); } } Spring Boot는 내부적으로 static 안에 있는 파일만 가져올 수 있도록 세팅되어있음...
Spring Boot - Java 동적 페이지 웹 크롤링 Selenium Notion에서 Tistory로 자동업로드하는 프로젝트를 진행중에 정적 웹 크롤링과 동적 웹 크롤링이 다르다는 것을 알게 되었다. 그래서 동적 웹 크롤링을 따로 공부해야했다. Selenium 셀레니움은 웹 애플리케이션을 실행시켜볼 수 있는 프레임워크이다. 자동 로그인, 자동 글쓰기, 자동 클릭 등 많은 기능을 사용할 수 있다. 의존성 Gradle implementation 'org.seleniumhq.selenium:selenium-java:4.6.0' Chrome Driver 다운로드 크롬 우측 위 … 클릭 도움말 Chrome 정보 클릭 후 버전 확인 https://chromedriver.chromium.org/downloads 사이트에서 맞는 Chrome driver 다운로드 다운받은 chromedr..
JavaScript - 이벤트 핸들러 이벤트 핸들러 : 웹 페이지에서 사용자 상호작용과 관련된 동적인 기능을 구현하기 위해 사용되는 기술이다. Ex) 마우스 클릭, 키보드 입력, 스크롤 등 자바스크립트는 다양한 이벤트 핸들링 API를 제공한다. HTML 내부 이벤트 핸들러 Click me 여기서 버튼을 누르면 onClick이라는 이벤트 핸들러에 통제하에 실행된다. 그리고 아래 스크립트 태그에서 자바스크립트 코드를 정의하고 있다. 그러나 이것은 지양하는 방법이다. 유지보수가 어렵고 보안에도 좋지 않다. 그래서 Chrome 확장 프로그램에서는 아에 내부 이벤트 핸들러가 포함되어 있으면 실행조차 안되도록 만들어 버린다. HTML 외부 이벤트 핸들러 텍스트 입력: Click me document.addEventListener('DOMContentL..