본문 바로가기

Backend

(76)
Node.js MySQL Transaction(트랜잭션) 노드에서 mysql 모듈을 사용할 때 트랜잭션 처리하는 방법에 대해서 알아볼게요. 아직 mysql을 연동하지 않았다면 이 글을 먼저 참고해주세요. https://gofnrk.tistory.com/61 Node MySQL 연동 (Express) Node.js에서 MySQL을 연동해볼게요. 연동하고 select, insert, update, delete 쿼리까지 실행시켜 볼거에요. 연동하고 사용하는 것 자체는 매우 간단해요. 우선, mysql2 모듈을 설치해줍니다. npm i mysql2 pool.j.. gofnrk.tistory.com 트랜잭션 예제는 게시글 댓글(board_comment)에 INSERT 하고, 게시글(board)에 댓글 수를 +1 UPDATE 해줄거에요. board와 board_comme..
자바 싱글톤 패턴 (Java Singleton Pattern) 자바 환경에서 싱글톤으로 객체를 사용하는 방법에 대해서 알아볼게요. 싱글톤 패턴은 디자인 패턴 중 하나로 최초 한 번만 객체를 생성을 하여 메모리에 할당하는 기법이에요. 동일한 객체를 지속적으로 사용해야 할 때가 있어요. 이 때마다 인스턴스를 생성해내는 것보다 하나의 인스턴스를 사용하는 것이 리소스 절약면에서 유리합니다. 싱글톤을 구현하는 방법은 굉장히 많이 나와있지만 딱 두 가지만 알면 되요. 기본 방법 많이 쓰는 방법 Simple 방법 우선, 가장 기본 방법부터 작성해볼게요. 최초 한 번 객체를 초기화하기 때문에 Thread-Safe를 보장합니다. 하지만, 객체를 사용하지도 않는 경우에도 이미 생성되어 있어서 사용하지 않는다면 리소스 낭비가 있을 수 있습니다. 사실 사용하지 않을 객체를 싱글톤으로 만..
자바 템플릿 메소드 패턴 (Java Template Method Pattern) 자바 디자인 패턴에서 많이 언급되는 패턴 중 하나에요. 도대체 이게 뭔지 바로 구현해볼게요. 예제로 길을 찾는 기능을 구현하려고 해요. 출발지와 목적지를 입력하면 빠른 길, 가까운 길, 무료 길 등등 원하는 길을 알려줄거에요. 템플릿 클래스 어떤 길을 찾건 출발지와 목적지는 공통적으로 받아야되요. 공통적인 기능은 템플릿 클래스에 구현하고 빠른, 가까운, 무료와 같이 알고리즘이 다른 기능은 추상 메소드로 선언하여 각각 구현하도록 할거에요. public abstract class Direction { // 출발, 도착 세팅 final void setStartAndDest(String start, String end) { System.out.println("출발지 : " + start); System.out...
Node.js MySQL 연동 (Express) Node.js에서 MySQL을 연동해볼게요. 연동하고 select, insert, update, delete 쿼리까지 실행시켜 볼거에요. 연동하고 사용하는 것 자체는 매우 간단해요. 우선, mysql2 모듈을 설치해줍니다. npm i mysql2 pool.js const mysql = require('mysql2/promise') const pool = mysql.createPool({ host: 'localhost', port: 3306, user: 'demouser', password: 'demo12#$', database: 'demo_db', connectionLimit: 10 }) module.exports = pool router 쿼리를 어떻게 사용하는지 볼 수 있도록 아주 간단하게 CRUD 기..
자바 빌더 패턴 (Java Builder Pattern) 장단점 우선, 빌더 패턴과 비교되는 패턴이 두 가지가 있어요. 두 가지 패턴은 용어만 거창하지 이미 알고 계실거에요. 점층적 생성자 패턴 : 생성자로 필드를 세팅, ex) new UserInfo(userId, password); 자바빈 패턴 : Setter 메서드로 필드를 세팅, ex) userInfo.set(userId); 빌더 패턴 이제, 빌더 패턴을 직접 구현해볼게요. Builder 패턴 직접 구현 @Getter public class UserInfo { private String userId; private String nickname; private String password; private String email; public static UserInfoBuilder builder() { retur..
JPA 작성자, 수정자 자동 세팅 Auditor JPA를 활용할 때 게시글의 작성자,수정자 아이디를 자동적으로 세팅해주고 싶은 경우가 있어요. 비즈니스 로직단에서 일일이 세팅하는 수고를 덜어주죠. 이 예제에서는 알아보기 쉽도록 아주 기본만 작성하였습니다. AuditorAwareConfig 소스 설명 드릴게요. UserInfo는 세션 아이디를 담아둔 객체입니다. 테이블에 넣어줄 로그인 사용자 ID를 Optional 클래스에 세팅하여 리턴하면 끝입니다. AuditorAware를 구현할 때 대부분의 예제에서는 별도의 클래스를 만들어서 임포트 받지만 여기서는 최대한 간단해보이도록 한 소스 파일에 직접 구현했습니다. @Resource private UserInfo userInfo; Long userId = userInfo.getIdIsLogin(); 로그인 체..
JPA @ManyToOne Join (Only JpaRepository) JPA에서 @ManyToOne 어노테이션으로 조인한 Entity를 Join으로 조회하려고 해요. Inner Join과 Left Outer Join 모두 다뤄보겠습니다. JpaRepository를 이용할거구요. Native Query는 사용하지 않을거에요. 작업 환경은 Spring Boot 2.1.9 + JDK 11 버전입니다. 1. BoardEntity @Entity @Table(name = "board") @Getter @Setter public class BoardEntity implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTI..
Spring Boot Interceptor 적용 스프링에서 공통적으로 처리할 로직을 구현하고 싶을 때가 있어요. 대표적으로 Java Filter, Spring Interceptor, Spring AOP를 활용할 수 있는데요. 이 글에선 Interceptor를 활용하여 특정 URI들의 요청을 가로채서 역할을 수행할 수 있도록 구현해볼거에요. Interceptor는 Spring Container 영역이며 Servlet 단위에서 실행되요. 인증/권한 처리, 로직 시간 계산, 로깅 등을 공통적으로 처리하고 싶을 때 사용해요. AuthInterceptor 이름만 Auth로 써봤어요. 실제로는 로그만 찍을겁니다. AuthInterceptor 클래스에 HandlerInterceptor 인터페이스를 구현할거에요. 스프링에서 다해줘요. 우리는 비즈니스 로직만 구현하면..