Java

Java, Kotlin, NestJS에서 Kafka/DB /JWT/환경설정

마시멜로를찾아서 2025. 4. 2. 14:06
반응형

Java(Spring Boot), Kotlin(Ktor), NestJS의 비교 내용 중:

  • Kafka 연동 방식
  • DB 연결 방식
  • JWT 인증 구조
  • 환경 설정 방식
  • 동일 기능 API 예제

각 항목별로 보기 쉽고, 핵심만 빠르게 파악할 수 있도록 구성

🔄 Kafka 연동 방식

Java (Spring Boot)

  • spring-kafka 사용
  • application.yml에 설정
  • @KafkaListener로 간단한 Consumer 구현 가능
spring:
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: my-group

Kotlin (Ktor)

  • kafka-clients 직접 사용
  • 코루틴과 함께 비동기 처리
  • 설정은 코드에서 수동으로 지정
val consumer = KafkaConsumer<String, String>(props)
consumer.subscribe(listOf("topic"))

NestJS

  • @nestjs/microservices + kafkajs
  • ClientsModule을 통한 Kafka 클라이언트 등록
  • 데코레이터 방식으로 간단하게 사용 가능
ClientsModule.register([
  {
    name: 'KAFKA_SERVICE',
    transport: Transport.KAFKA,
    options: {
      client: {
        brokers: ['localhost:9092'],
      },
    },
  },
])

🛢️ DB 연결 방식

Java (Spring Boot)

  • JPA (Hibernate) + Spring Data
  • application.yml로 DB 연결 설정
  • Repository 패턴, 트랜잭션 처리 간편

Kotlin (Ktor)

  • Exposed 또는 JPA 사용
  • DSL 기반 SQL 쿼리 작성이 가능 (Exposed)
  • 설정은 코드 기반 또는 conf 파일 사용

NestJS

  • TypeORM 또는 Prisma
  • .env 파일과 TypeOrmModule.forRoot 사용
  • TypeScript로 프론트와 타입 공유 유리

🔐 JWT 인증 구조

Java (Spring Security)

  • OncePerRequestFilter로 토큰 필터링
  • SecurityConfig에서 인증 경로, 인가 설정
  • 커스터마이징 매우 세분화 가능

Kotlin (Ktor)

  • Authentication 플러그인 사용
  • JWTVerifier 설정 필요
  • call.principal<JWTPrincipal>()로 사용자 추출

NestJS

  • @nestjs/jwt + PassportModule
  • AuthGuard('jwt')로 인증 처리
  • JwtStrategy에서 토큰 검증 구현

⚙️ 환경 설정 방식

Java (Spring Boot)

  • application.yml, @Value, @ConfigurationProperties
  • @Profile을 통해 dev/stage/prod 전환 가능

Kotlin (Ktor)

  • application.conf (HOCON) 또는 코드 기반 설정
  • 타입 안전한 구성 가능

NestJS

  • .env + ConfigModule
  • ConfigService로 환경 변수 주입

🧪 동일 기능 API 예제 (GET /greet?name=홍길동 → "Hello, 홍길동!")

Java (Spring Boot)

@RestController
@RequestMapping("/api")
public class GreetController {
    @GetMapping("/greet")
    public String greet(@RequestParam String name) {
        return "Hello, " + name + "!";
    }
}

 

Kotlin (Ktor)

routing {
    get("/greet") {
        val name = call.parameters["name"] ?: "World"
        call.respondText("Hello, $name!")
    }
}

 

 

NestJS (TypeScript)

@Controller('api')
export class GreetController {
  @Get('greet')
  greet(@Query('name') name: string): string {
    return `Hello, ${name || 'World'}!`;
  }
}

필요하시면 여기서 더 확장해서 Swagger, 테스트 코드, CI/CD, 마이크로서비스 구성 차이도 정리해드릴 수 있어요!

반응형