전체 글

하고 싶은 것들을 하며 성공하기
· Front-end
개요자사 서비스 어드민 페이지 유지 보수 및 기능 개발을 맡게 되었다. 이에 따라 처음으로 프론트 리액트 공부를 하게 되었고, 내용을 정리하여 한다.본문 Total clicks: 0 Click me span특정 텍스트를 감싸는 인라인 컨테이너이다. javascript로 특정 span의 텍스트 내용을 변경할 수 있다.템플릿 리터럴(``)자바스크립트에서 문자열로 나타낼 수 있으며 변수를 문자열과 같이 넣을 수 있어 편리하다. java나 C 같은 언어에서는 문자열에서 '+' 같은 연산자를 사용해야 하는데 자바스크립트는 이것도 지원하지만 더 편리하게 이를 사용할 수 있다. ${variable name}을 내부에 적으면 된다. 여기에선 count 변수의 값을 넣어주고 있다.document로드된 HTML 문서..
개요 벌써 취업해서 일한지 4주차이다. 나는 지금 하루가 다르게 성장하며 배우고 즐겁게 일하고 있다. 다만 시간이 부족할 뿐...! 입사하자 마자 4주차까지 SI로 일했고, 이제 드디어 자사 서비스 개발에 들어간다. 그래서 4주간 일했던 경험을 피드백으로 작성해볼 것이다. 평소 나는 ORM을 주로 사용했다. Spring에 DataJPA 또는 NestJS에 TypeORM으로 코드로 추상화 된 DB 작업만 했는데 여기에선 Spring에 xml 파일 기반의 MyBatis라는 DB Mapper를 사용했다. 4주간 이 덕분에 기술 부채로 남겨뒀던 SELECT 문을 맘껏 써봤다. 지금은 SELECT문 작성과 두 개 이상의 서브 쿼리, CTE(Common Table Expression)을 사용한 복잡한 조회 문을 손..
· SQL
Function DATE_FORMAT() WHERE date_format(sales_ym, '%Y%m') = date_format(date_add(now(), interval - 1 month), '%Y%m'), '%Y%m' 값을 주어진 형식에 맞춰 문자열로 변환하는 함수이다. 위처럼 sales_ym이 char(6)의 문자열일 때 이를 date_format으로 받을 수 없다. date_format은 단순 문자열이 아니라 날짜 또는 시간만 받을 수 있다. WHERE sales_ym = date_format(date_add(now(), interval - 1 month), '%Y%m') 그렇기 때문에 가장 위처럼 하는 것은 이미 202403, 202404 등의 형식으로 저장된 문자열을 의미 없이 같은 타입의..
· Spring
개요 Spring JPA를 사용하여 개발을 진행하다 cascade = CascadeType.ALL과 orphanRemoval = true에 대한 예시를 많이 봐왔다. 연관관계를 갖는 엔티티 간 설정하는 것이라 들었고, 무엇인가 삭제했을 때 연쇄적으로 쉽게 삭제해준다고 막연하게 알고 있었다. 하지만 이를 남용하기엔 '삭제'와 관련 되어 있어 위험하다 판단 되어 제대로 찾아보기로 했다. 본문 Cascade.ALL은 PERSIST, MERGE, REMOVE, REFRESH, DETACH와 같은 상태 변환를 관리한다. 즉, 수정, 삭제, 추가의 작업이 일어날 때 연쇄적으로 관계를 갖는 엔티티에 영향을 주는 것이다. orphanRemoval은 부모, 자식을 가질 때 부모와의 관계가 끊어졌을 때 자식을 삭제하는 것..
A Review of Filters Spring security support는 Servlet Filter 기반이기 때문에 일반적으로 처음에 Filter의 역할을 찾아보는 것이 유용하다. 아래는 하나의 HTTP 요청을 위한 handler의 전형적인 계층을 보여준다. 클라이언트가 애플리케이션에 요청을 보내면, 컨테이너는 요청 URI를 기반으로 한 HttpServletRequest를 처리해야 하는 Filter instance와 Servlet을 포함한 FilterChain을 생성한다. Spring MVC application에서의 Servlet은 DispatcherServlet이다. 많아 봐야 하나의 Servlet은 하나의 HttpServletRequest와 HttpServletResponse를 다룰 수 있다..
· Spring
[개요] Spring을 통해 프로젝트를 진행하기 위해 로컬 DB인 MySQL을 연결하려 한다. Spring은 내부적으로 자체적인 DB 관련 애플리케이션이 존재한다. 그래서 미리 정의된 변수에 올바른 값만 넣어준다면 쉽게 DB와 연결할 수 있다. 해당 변수는 src/main/resources/application.properties 파일에서 할당할 수 있다. 그런데 값을 할당하는 과정에서 제대로 된 값을 넣었는데 연결을 실패하는 경우가 있다. 이들의 공통점을 분석해보고, 어떻게 하면 문제가 생기지 않을지 정리해보겠다. [본문] # MySQL spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql..
[개요] 서비스에는 인증 되지 않은 모든 유저가 접근할 수 있는 리소스가 있다. 하지만 특정 리소스는 로그인 인증이 되어야만, 인증이 되어도 특정 권한이 있어야만 접근할 수 있는 것이 필요할 수도 있다. 이를 Spring security로 쉽게 설정할 수 있다. 이 방법을 정리해보려 한다. [본문] package com.example.testsecurity.config; import lombok.Getter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation...
[개요] 프로젝트를 진행하며 Front-end와 Back-end 사이에 주고 받을 API 명세서를 설계하게 되었다. 두 번의 웹 서비스 프로젝트를 거치며 적당하다 생각하는 정도를 담아 규칙 등을 이유와 함께 정리하려 한다. [본문] HTTP status code JWT 등 토큰이 만료 되었거나 유효하지 않은 토큰일 시 401(Unauthorized)를 응답한다. HTTP(하이퍼텍스트 전송 프로토콜) 401 Unauthorized 응답 상태 코드는 요청된 리소스에 대한 유효한 인증 자격 증명이 없기 때문에 클라이언트 요청이 완료되지 않았음을 나타냅니다. 이 상태 코드는 사용자에게 인증 자격 증명을 입력하라는 메시지를 표시한 후 클라이언트가 리소스를 다시 요청할 수 있는 방법이 포함된 HTTP WWW-Aut..
jayoon
자윤 블로그