반응형

백엔드 37

nestjs) 미들웨어,가드,필터

항상 nestjs를 사용하면서 이 세가지에 대해 개념이 헷갈리는 경우가 많아서 정리하고자 합니다.1. Middleware (미들웨어)Middleware란?Middleware는 컨트롤러에 도달하기 전에 요청을 가로채서 전처리하는 역할을 합니다.Express의 미들웨어와 유사하게, 로깅, 인증, 요청 변환, CORS 처리 등의 용도로 사용됩니다.✅ Middleware 특징요청(Request) → 미들웨어 실행 → 컨트롤러 실행next()를 호출해야 다음 미들웨어 또는 컨트롤러로 요청 전달 가능전역(Global), 모듈(Module), 특정 라우트(Route) 단위로 적용 가능 Middleware 예제: 역할(Role) 기반 접근 제한사용자의 역할(Role)에 따라 특정 API 접근을 제한하는 미들웨어를 만들..

백엔드/NestJs 2025.03.13

스프링 빈을 등록하는 2가지 방법

스프링에서 빈을 등록하는 방법은 2가지가 존재한다. 1. 컴포넌트 스캔과 자동 의존관계 설정 2. 자바 코드로 직접 스프링 빈 등록하기 먼저, 컴포넌트 스캔과 자동 의존관계를 설정하는 것을 알아보자면 - @Component 어노테이션이 있으면 스프링 빈으로 자동 등록이 된다. - @Controller 어노테이션이 붙으면, 이것 또한 스프링 빈으로 자동 등록되는데 이유는 컴포넌트 스캔 때문이다. @Componet를 포함하는 다음 어노테이션도 스프링 빈으로 자동 등록된다. - @Controller - @Service - @Repository 두번째로는 자바 코드로 직접 스프링 빈을 등록하는 방법이다. @Configuration 어노테이션을 이용하여 직접 빈을 등록한다. @Configuration public..

[JPA] @MappedSuperclass

@MappedSuperclass 어노테이션은 JPA (Java Persistence API)에서 매우 유용한 어노테이션 중 하나이다. 이 어노테이션은 엔티티 클래스들이 공통으로 사용하는 필드나 메소드(예: id, createdAt, updatedAt 등)를 부모 클래스에 정의하고 싶을 때 사용되는데 이 부모 클래스를 상속받는 자식 클래스들이 이러한 공통된 필드나 메소드를 재사용할 수 있게 한다. 하지만 @MappedSuperclass로 지정된 클래스는 직접적으로 엔티티로 사용될 수 없는데, 테이블로 매핑되지 않으므로 단독으로 인스턴스를 생성하거나 쿼리의 대상이 될 수 없다는 특징이 있다. @MappedSuperclass 특징 1. 재사용성 : 공통 매핑 정보를 부모 클래스에서 정의함으로써, 여러 엔티티에..

@Builder 어노테이션

스프링을 사용하면서 엔티티를 작성할때 @Bulder 어노테이션을 붙였었는데, 다른 코드를 살펴보니 @Builder(builderMethodName = "entityBuilder", toBuilder = true) 이런식으로 @Bulder 어노테이션 옆에 속성값도 붙이는 경우가 있다는 것을 알게 되었다. @Bulder 어노테이션에 속성을 안붙이고 그냥 사용하던 나는 이 옵션이 왜 사용되는지 궁금해져서 검색하게 되었다. 1. builderMethodName 해당 속성은 빌더 패턴을 위한 메서드의 이름을 지정한다. 기본적으로 Lombok의 @Builder 는 'builder()' 라는 정적 메서드를 생성하는데, 만약 자기가 직접 커스텀한 이름을 짓고싶다면 해당 속성을 이용하여 변경해줄 수 있다. 예를들어, 위..

[typeorm] getRawMany(), getMany()

몇일전 nestjs 에서 레포지토리쪽 코드를 작성하는데 쿼리빌더에서 select를 해오지 못하는 현상이 발생하였다. 분명히 기존 다른 코드들은 getMany()로 select를 해서 그대로 사용했을 뿐인데 오류메세지가 'cant find databaseName' 이 발생하였다. 나는 어리둥절하면서 구글링을 열심히 해봤는데 db 커넥션을 조정해보라는 글밖에 찾지 못하다가 해결방법을 찾아냈다. 그거슨 바로 getRawMany()로 바꾸는 것이었다. 근데 대체 getRawMany()랑 getMany()가 뭔차이길래?!! 왜 데이터베이스 이름을 찾을수 없다고 뜨는걸까? 차이점이 그래서 뭔데?? - queryBuilder.getRawMany() 랑 queryBuilder.getMany() 의 주요 차이점은 반환되..

백엔드/NestJs 2023.12.12

@Valid 어노테이션

api를 만들 때, 서비스 부분에서 예외처리를 했었는데, nestjs 를 사용할때처럼 기본적으로 null값이나 blank를 자체적으로 exception 이 되도록 하는 방법은 없을까 생각하는 찰나에 @Valid 어노테이션에 대해 알게 되었다. @Valid 어노테이션은 @Valid , @Validated 두가지가 존재하고, 이 두개의 어노테이션을 이용하면 내가 서비스에서 예외처리 코드를 만들지 않아도 null 또는 blank, 길이 등에 대해 오류가 발생하면 자체적으로 예외처리가 된다. 아래에서 예제를 들어보겠다. 1. 디펜던시 추가 gradle 에 해당 디펜던시를 추가하여 어노테이션을 사용할 수 있도록 설정한다. 먼저, gradle에 해당 디펜던시를 추가한다. implementation 'org.spri..

Spring) @EnableJpaAuditing 이란?

보통 엔티티를 만들 때 아래와 같이 만들 것이다. public class User { @Id private Long id @Column private String name @Column private DateTime createdAt; @Column private DateTime updatedAt; @Column private String useYn; } 여기서 createAt, updatedAt, useYn 은 기본적으로 공통으로 사용되는 필드들인데, 해당 필드를 매번 엔티티를 생성할때마다 작성하고, setter를 사용해서 넣어주는 것이 여간 귀찮은 일이 아닐 수 없다. 이 때 사용되는게 @EnableJpaAuditing 어노테이션으로 볼 수 있다. @EnableJpaAuditing 이란? 해당 어노테..

UserDetails 커스텀을 통한 @AuthenticationPrincipal 어노테이션 사용

로그인한 유저의 정보를 controller에서 받아보고 싶어서 검색해보니 @AuthenticationPrincipal 어노테이션을 사용하면 유저이름과 권한, 비밀번호를 받을 수 있는 것을 찾게 되었다. 그런데, 해당 어노테이션은 위의 3가지만을 받아올 수 있었는데, 나는 로그인한 유저의 id, 이름, 핸드폰정보 등 다른 정보도 받고 싶었기 때문에 해당 어노테이션을 커스텀하는 방법을 물색하였다. 해당 어노테이션을 커스텀 하려면 Spring Security 의 UserDetails 랑 UserDetailsService 를 손봐야 했다. 먼저 UserDetails에 대해 설명하자면 다음과 같다. UserDetails? 💡 Spring Security에서 사용자의 정보를 담는 인터페이스이다. Spring Sec..

[nestjs] PickType,OmitType, PartialType

nestjs에서 graphql을 사용할 때, ObjectType과 InputType을 통해 input과 output 스키마를 설정하게 된다. 이 때, ObjectType 및 InputType을 작성할 때, 엄청나게 많은 필드들을 중복적으로 다른 스키마에서 사용할 때가 있는데, 이 때마다 똑같은 필드들을 중복해서 작성하는 것은 비효율적이다. 이럴때 사용하는 것이 PickType, OmitType, PartialType 인데 아레에서는 각각 언제 사용하는지 설명하도록 하겠다. 1. PickType PickType은 특정 필드만을 선택하여 새로운 타입을 만들 때 사용된다. 만약 예를들어, 아래와 같은 ObjectType이 존재한다고 가정하겠다. @ObjectType('UserList') export class..

백엔드/NestJs 2023.09.25

[Spring Boot] @RequestParam & @RequestBody

HTML 삽입 미리보기할 수 없는 소스 리퀘스트에서는 @RequestBdoy, @RequestParam 으로 리퀘스트 전달값을 받는 어노테이션이 존재한다. 해당 어노테이션은 서블렛과 유사하지만 더 편의성의 증대된 어노테이션으로 아래에서 설명하고자 한다. 1. @RequestParam 보통 @RequestMapping은 클래스 위에 붙여서 기본적인 엔드포인트를 지정하는데, 아래의 예제에서는 각각의 엔드포인트를 설정하도록 메서드 위에 붙여놓았다. package hello.springmvc.basic.request; import hello.springmvc.basic.HelloData; import jakarta.servlet.http.HttpServletRequest; import jakarta.servle..

반응형