41.Nest.js와 Next.js에서 웹소켓 활용하기, Next.js 클라이언트에서 웹소켓 연결 및 데이터 수신

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

웹소켓이란?

웹소켓(WebSocket)은 클라이언트와 서버 간의 전이중(양방향) 통신을 가능하게 하는 프로토콜입니다. 기존의 HTTP 프로토콜은 클라이언트가 요청을 하고 서버가 응답을 하는 구조인 반면, 웹소켓은 클라이언트와 서버가 서로 자유롭게 메시지를 주고받을 수 있는 연결을 유지합니다. 이러한 특성 덕분에 실시간 데이터 전송이 필요한 어플리케이션에서 웹소켓은 매우 유용합니다. 예를 들어, 채팅 애플리케이션, 실시간 게임, 주식 시세 전송 앱 등에서 널리 사용됩니다.

Nest.js 소개

Nest.js는 Node.js를 기반으로 하는 현대적인 웹 애플리케이션 프레임워크입니다. Angular에서 영감을 받아 모듈 기반 아키텍처를 채택하고 있으며, TypeScript를 기본으로 지원합니다. Nest.js를 사용하면 구조화된 코드를 작성할 수 있어 유지보수와 확장성이 뛰어납니다. Nest.js는 웹소켓을 포함한 다양한 통신 프로토콜을 지원하여 실시간 애플리케이션 개발에 적합합니다.

Next.js 소개

Next.js는 React를 기반으로 한 프레임워크로, 서버 사이드 렌더링(SSR)과 정적 사이트 생성(SSG) 기능을 제공합니다. 이를 통해 SEO에 유리하고 빠른 렌더링을 할 수 있는 장점이 있습니다. 또한, Next.js는 API 라우트 기능을 사용해 서버 측 로직도 간단히 작성할 수 있습니다. 이러한 특성 덕분에 Next.js는 실시간 애플리케이션을 개발하는 데 매우 유용합니다.

Nest.js에서 웹소켓 설정하기

Nest.js에서 웹소켓을 사용하는 방법은 다음과 같습니다. 먼저, 웹소켓 서버를 구현하기 위해 @nestjs/websockets 패키지를 설치합니다. 이를 통해 웹소켓의 기본적인 기능을 쉽게 사용할 수 있습니다.

설치

npm install @nestjs/websockets @nestjs/platform-socket.io socket.io

웹소켓 게이트웨이 만들기

다음으로, 웹소켓 게이트웨이를 생성합니다. 웹소켓 게이트웨이는 클라이언트의 요청을 받고 메시지를 송수신하는 역할을 합니다. 아래는 간단한 웹소켓 게이트웨이의 예입니다.


import { WebSocketGateway, WebSocketServer, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets';
import { Server } from 'socket.io';

@WebSocketGateway()
export class AppGateway implements OnGatewayConnection, OnGatewayDisconnect {
    @WebSocketServer() server: Server;

    handleConnection(client: any) {
        console.log('클라이언트 연결됨');
    }

    handleDisconnect(client: any) {
        console.log('클라이언트 연결 끊김');
    }

    sendMessage(message: string) {
        this.server.emit('message', message);
    }
}

위 코드에서 handleConnectionhandleDisconnect 메서드는 각각 클라이언트가 연결되거나 연결이 끊어질 때 호출됩니다. sendMessage 메서드는 모든 클라이언트에게 메시지를 전송하는 기능을 수행합니다.

Next.js 클라이언트에서 웹소켓 연결하기

Next.js 클라이언트에서 웹소켓에 연결하기 위해 socket.io-client 라이브러리를 사용할 수 있습니다. 먼저 이 라이브러리를 설치해야 합니다.

설치

npm install socket.io-client

클라이언트 설정

먼저 Next.js 프로젝트의 페이지 컴포넌트에서 웹소켓 연결을 설정합니다. 아래는 기본적인 웹소켓 클라이언트 구현 예입니다.


import { useEffect } from 'react';
import { io } from 'socket.io-client';

const socket = io('http://localhost:3000');

const Home = () => {
    useEffect(() => {
        socket.on('message', (message) => {
            console.log('서버로부터 받은 메시지:', message);
        });

        return () => {
            socket.off('message');
        };
    }, []);

    const sendMessage = () => {
        socket.emit('message', '안녕하세요, 서버!');
    };

    return (
        

웹소켓 테스트

); }; export default Home;

위 코드에서는 socket.io-client를 사용하여 서버와의 웹소켓 연결을 설정하고 있습니다. 클라이언트가 연결되면 서버로부터 수신한 메시지를 콘솔에 출력합니다. 또한, 버튼을 클릭하면 서버에 메시지를 보낼 수 있습니다.

서버와 클라이언트 간의 데이터 송수신

이렇게 설정한 웹소켓 서버와 클라이언트 간에 실시간 데이터 송수신을 구현할 수 있습니다. 예를 들어, 클라이언트에서 메시지를 보내면 서버는 그 메시지를 처리하고 다시 클라이언트로 전달할 수 있습니다. 이 기능을 통해 다양한 실시간 애플리케이션을 개발할 수 있습니다.

서버에서 클라이언트로 데이터 전송

서버에서 클라이언트로 데이터 전송하는 예는 다음과 같습니다. 간단한 메시지를 전송하는 기능을 추가하여 클라이언트가 연결된 모든 클라이언트에게 매 5초마다 메시지를 전송해보겠습니다.


import { WebSocketGateway, WebSocketServer, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets';
import { Server } from 'socket.io';

@WebSocketGateway()
export class AppGateway implements OnGatewayConnection, OnGatewayDisconnect {
    @WebSocketServer() server: Server;

    handleConnection(client: any) {
        console.log('클라이언트 연결됨');
    }

    handleDisconnect(client: any) {
        console.log('클라이언트 연결 끊김');
    }

    broadcastMessage() {
        setInterval(() => {
            this.server.emit('message', '서버에서 전송한 메시지입니다.');
        }, 5000);
    }
}

위 코드의 broadcastMessage 메서드는 매 5초마다 모든 연결된 클라이언트에게 메시지를 전송합니다. 이 메서드를 constructor 내에서 호출하여 서버가 실행되면 자동으로 클라이언트에 메시지를 보내도록 설정할 수 있습니다.

에러 처리와 최적화

실시간 웹소켓 애플리케이션에서 에러 처리는 중요한 부분입니다. 발생할 수 있는 다양한 에러를 예방하고 사용자가 이해할 수 있도록 적절한 피드백을 제공해야 합니다. 클라이언트에서는 웹소켓 연결의 상태를 관리하고 에러를 처리할 수 있는 방법을 구현하는 것이 좋습니다.

클라이언트 에러 처리


useEffect(() => {
    socket.on('connect_error', (err) => {
        console.error('서버에 연결할 수 없습니다:', err.message);
    });

    socket.on('disconnect', (reason) => {
        if (reason === 'io server disconnect') {
            console.log('서버가 클라이언트를 연결 해제했습니다.');
            // 자동 재연결 시도
            socket.connect();
        }
    });

    return () => {
        socket.off('connect_error');
        socket.off('disconnect');
    };
}, []);

위 코드에서는 연결 오류와 연결 해제 시의 이벤트를 처리하고 있습니다. 이러한 처리를 통해 사용자가 문제를 인지하고 적절한 조치를 취할 수 있게 됩니다.

결론

Nest.js와 Next.js를 활용한 웹소켓 애플리케이션 개발은 실시간 기능 구현을 위해 매우 효과적입니다. 간단한 설정만으로 양방향 통신을 할 수 있으며, 이를 통해 다양한 기능을 추가할 수 있습니다. 이번 글을 통해 기본적인 웹소켓 사용법과 클라이언트-서버 간의 데이터 송수신 방법을 살펴보았습니다. 다양한 웹소켓 기능을 실험하여 더 나아가고, 실시간 애플리케이션을 더욱 풍성하게 만드는 데 도움이 되길 바랍니다.

15.Next.js와 Nest.js 연동하여 데이터 가져오기, 블로그 목록 페이지와 상세 페이지에 데이터 연결하기

이번 글에서는 Next.jsNest.js를 활용하여 블로그 목록 페이지와 상세 페이지에 데이터를 연동하는 방법에 대해 자세히 알아보겠습니다. Next.js는 React 기반의 프레임워크로, 서버 사이드 렌더링과 정적 사이트 생성을 지원하여 최적의 성능을 자랑합니다. Nest.js는 Node.js 애플리케이션을 위한 강력한 프레임워크로, 특히 RESTful API 개발에 적합합니다. 이 두 프레임워크를 결합하여 효율적인 웹 애플리케이션을 만들 수 있습니다.

1. 프로젝트 구조 설정

먼저, 두 프레임워크를 연동할 프로젝트 구조를 설정합니다. Nest.js를 백엔드 API 서버로, Next.js를 프론트엔드 웹 애플리케이션으로 사용할 것입니다.

  • 프로젝트 루트 폴더
    • nest-backend/
    • next-frontend/

1.1 Nest.js 프로젝트 생성

먼저, Nest.js 프로젝트를 생성합니다. Nest CLI를 사용하여 새로운 프로젝트를 생성하고 의존성을 설치합니다.

            
            npm install -g @nestjs/cli
            nest new nest-backend
            cd nest-backend
            npm install @nestjs/typeorm typeorm mysql2
            
            

여기서는 MySQL을 데이터베이스로 사용하였지만, 필요한 경우 다른 데이터베이스를 사용할 수도 있습니다.

1.2 Next.js 프로젝트 생성

그 다음, Next.js 프로젝트를 생성합니다. create-next-app을 사용하여 빠르게 설정할 수 있습니다.

            
            npx create-next-app next-frontend
            cd next-frontend
            npm install axios
            
            

axios는 클라이언트에서 API를 호출할 때 사용할 라이브러리입니다.

2. Nest.js API 구축

Nest.js를 사용하여 블로그 API를 구축합니다. 블로그 포스트를 다루기 위해 Post 엔티티를 생성하고, CRUD 기능을 구현합니다.

2.1 Post 엔티티 생성

Nest.js의 TypeORM을 사용하여 Post 엔티티를 생성합니다. src/posts/post.entity.ts 파일을 생성하고 다음과 같이 작성합니다:

            
            import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

            @Entity()
            export class Post {
                @PrimaryGeneratedColumn()
                id: number;

                @Column()
                title: string;

                @Column('text')
                content: string;

                @Column()
                createdAt: Date;

                @Column()
                updatedAt: Date;
            }
            
        

2.2 Posts 모듈 및 서비스 생성

Posts 모듈을 생성하고 CRUD 로직을 추가합니다. src/posts/posts.module.tssrc/posts/posts.service.ts 파일을 각각 생성합니다.

            
            import { Module } from '@nestjs/common';
            import { TypeOrmModule } from '@nestjs/typeorm';
            import { PostsController } from './posts.controller';
            import { PostsService } from './posts.service';
            import { Post } from './post.entity';

            @Module({
                imports: [TypeOrmModule.forFeature([Post])],
                controllers: [PostsController],
                providers: [PostsService],
            })
            export class PostsModule {}
            
        

2.3 Posts Controller 생성

PostsController를 생성하여 API 엔드포인트를 정의합니다. src/posts/posts.controller.ts 파일을 다음과 같이 작성합니다:

            
            import { Controller, Get, Post, Body, Param } from '@nestjs/common';
            import { PostsService } from './posts.service';
            import { Post } from './post.entity';

            @Controller('posts')
            export class PostsController {
                constructor(private readonly postsService: PostsService) {}

                @Get()
                async findAll(): Promise {
                    return this.postsService.findAll();
                }

                @Get(':id')
                async findOne(@Param('id') id: string): Promise {
                    return this.postsService.findOne(+id);
                }

                @Post()
                async create(@Body() post: Post): Promise {
                    return this.postsService.create(post);
                }
            }
            
        

2.4 Posts Service 구현하기

최종적으로, PostsService를 구현하여 데이터베이스와의 상호작용을 처리합니다. src/posts/posts.service.ts 파일을 다음과 같이 작성합니다:

            
            import { Injectable } from '@nestjs/common';
            import { InjectRepository } from '@nestjs/typeorm';
            import { Repository } from 'typeorm';
            import { Post } from './post.entity';

            @Injectable()
            export class PostsService {
                constructor(
                    @InjectRepository(Post)
                    private postsRepository: Repository,
                ) {}

                async findAll(): Promise {
                    return this.postsRepository.find();
                }

                async findOne(id: number): Promise {
                    return this.postsRepository.findOne(id);
                }

                async create(post: Post): Promise {
                    return this.postsRepository.save(post);
                }
            }
            
        

3. Next.js와 API 연동하기

이제 Next.js 애플리케이션에서 Nest.js API를 호출하여 데이터를 가져오고 페이지에 렌더링합니다. 블로그 목록 페이지와 상세 페이지를 구현해 보겠습니다.

3.1 블로그 목록 페이지 생성

블로그 목록 페이지를 생성하여 모든 포스트를 표시합니다. pages/index.js 파일을 다음과 같이 수정합니다:

            
            import { useEffect, useState } from 'react';
            import axios from 'axios';

            const Home = () => {
                const [posts, setPosts] = useState([]);

                useEffect(() => {
                    const fetchData = async () => {
                        const result = await axios('http://localhost:3000/posts');
                        setPosts(result.data);
                    };
                    fetchData();
                }, []);

                return (
                    

블로그 목록

); }; export default Home;

3.2 블로그 상세 페이지 생성

각 포스트의 상세 정보를 보여주기 위해 블로그 상세 페이지를 생성합니다. pages/post/[id].js 파일을 생성하고 다음과 같이 작성합니다:

            
            import { useRouter } from 'next/router';
            import { useEffect, useState } from 'react';
            import axios from 'axios';

            const PostDetail = () => {
                const router = useRouter();
                const { id } = router.query;
                const [post, setPost] = useState(null);

                useEffect(() => {
                    if (id) {
                        const fetchData = async () => {
                            const result = await axios(`http://localhost:3000/posts/${id}`);
                            setPost(result.data);
                        };
                        fetchData();
                    }
                }, [id]);

                if (!post) return 

Loading...

; return (

{post.title}

{post.content}

); }; export default PostDetail;

4. 결론

이번 글에서는 Next.js와 Nest.js를 연동하여 블로그 앱을 만드는 과정을 안내했습니다. Nest.js를 통해 API 서버를 구축하고, Next.js를 사용하여 클라이언트 사이드에서 데이터를 가져와서 렌더링하는 방법을 배웠습니다. 이 과정을 통해 두 프레임워크의 특성을 이해하고, 실전에 어떻게 활용할 수 있는지에 대한 통찰을 얻을 수 있었기를 바랍니다.

여기서 소개한 방법은 기본적인 예제에 불과하며, 실제 프로젝트에서는 좀 더 복잡한 상태 관리, 에러 처리, 팬던시 구현 등을 고려해야 합니다. 여러분의 프로젝트에 맞게 다양한 기능을 추가하고 발전시켜 나가십시오.

17.Next.js와 Nest.js로 사용자 인증 구현하기, 로그인, 로그아웃, 회원가입 API 만들기

웹 개발에서 사용자 인증은 필수적인 요소입니다. 사용자가 안전하게 시스템에 접근할 수 있도록 하고, 개인정보를 보호하는 것이 매우 중요하다. 이번 강좌에서는 Next.js와 Nest.js를 사용하여 사용자 인증을 구현하는 방법을 자세히 살펴보겠습니다.

1. 프로젝트 설정

사용자 인증 시스템을 구현하기 위해 두 가지 프레임워크인 Next.js와 Nest.js를 사용할 것입니다. Next.js는 프론트엔드 프레임워크로 서버 사이드 렌더링(SSR)과 정적 웹사이트 생성을 지원합니다. 반면 Nest.js는 Node.js 기반의 백엔드 프레임워크로, 현대적인 서버 애플리케이션을 구축하는 데 적합합니다.

1.1 Nest.js 초기 설정

npm i -g @nestjs/cli
nest new backend
cd backend
npm install @nestjs/passport passport passport-local @types/passport-local bcrypt @types/bcrypt
npm install --save @nestjs/jwt passport-jwt @types/passport-jwt

1.2 Next.js 초기 설정

npx create-next-app frontend
cd frontend
npm install axios

2. Nest.js에서 사용자 인증 API 구현

Nest.js에서는 사용자 인증을 구현하기 위해 Passport.js와 JWT(JSON Web Token)를 사용할 것입니다.

2.1 User 엔티티 생성

먼저 User 엔티티를 생성합니다. 다음은 user.entity.ts 파일의 코드입니다.

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
    @PrimaryGeneratedColumn()
    id: number;

    @Column({ unique: true })
    email: string;

    @Column()
    password: string;
}

2.2 UserService 및 UserModule 생성

import { Injectable } from '@nestjs/common';
import { User } from './user.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import * as bcrypt from 'bcrypt';

@Injectable()
export class UserService {
    constructor(
        @InjectRepository(User)
        private userRepository: Repository,
    ) {}

    async create(userDto: { email: string; password: string }): Promise {
        const hashedPassword = await bcrypt.hash(userDto.password, 10);
        const user = this.userRepository.create({ ...userDto, password: hashedPassword });
        return this.userRepository.save(user);
    }

    async findByEmail(email: string): Promise {
        return this.userRepository.findOne({ where: { email } });
    }
}

2.3 AuthModule 및 AuthService 생성

import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { JwtModule } from '@nestjs/jwt';
import { AuthService } from './auth.service';
import { LocalStrategy } from './local.strategy';
import { UsersModule } from '../users/users.module';

@Module({
    imports: [
        UsersModule,
        PassportModule,
        JwtModule.register({
            secret: 'SECRET_KEY', // 비밀키 설정
            signOptions: { expiresIn: '60s' }, // 토큰 유효 시간 설정
        }),
    ],
    providers: [AuthService, LocalStrategy],
})
export class AuthModule {}

2.4 로그인 및 회원가입 API 엔드포인트 추가

import { Controller, Post, Body, Req } from '@nestjs/common';
import { AuthService } from './auth.service';

@Controller('auth')
export class AuthController {
    constructor(private readonly authService: AuthService) {}

    @Post('register')
    async register(@Body() userDto: { email: string; password: string }) {
        return this.authService.register(userDto);
    }

    @Post('login')
    async login(@Body() userDto: { email: string; password: string }) {
        return this.authService.login(userDto);
    }
}

3. Next.js의 사용자 인증 UI 구현하기

Next.js에서는 사용자 인증을 위한 로그인 및 회원가입 폼을 구현합니다. 사용자 입력을 처리하여 Nest.js 백엔드로 요청을 보내도록 합니다.

3.1 로그인 페이지 구현

import axios from 'axios';
import { useState } from 'react';

const Login = () => {
    const [email, setEmail] = useState('');
    const [password, setPassword] = useState('');

    const handleSubmit = async (e) => {
        e.preventDefault();
        const response = await axios.post('/api/auth/login', { email, password });
        // 로그인 성공 시 처리
    };

    return (
        
setEmail(e.target.value)} placeholder="Email" /> setPassword(e.target.value)} placeholder="Password" />
); }; export default Login;

3.2 회원가입 페이지 구현

import axios from 'axios';
import { useState } from 'react';

const Register = () => {
    const [email, setEmail] = useState('');
    const [password, setPassword] = useState('');

    const handleSubmit = async (e) => {
        e.preventDefault();
        const response = await axios.post('/api/auth/register', { email, password });
        // 회원가입 성공 시 처리
    };

    return (
        
setEmail(e.target.value)} placeholder="Email" /> setPassword(e.target.value)} placeholder="Password" />
); }; export default Register;

4. 사용자 인증 상태 관리

로그인 이후에는 사용자의 인증 상태를 관리해야 합니다. Next.js에서는 Context API 또는 Redux와 같은 상태 관리 라이브러리를 활용할 수 있습니다.

4.1 Context API를 사용한 상태 관리

import { createContext, useContext, useState } from 'react';

const AuthContext = createContext();

export const AuthProvider = ({ children }) => {
    const [user, setUser] = useState(null);
    const login = (userData) => setUser(userData);
    const logout = () => setUser(null);

    return (
        
            {children}
        
    );
};

export const useAuth = () => useContext(AuthContext);

5. 마무리

이번 강좌에서는 Next.js와 Nest.js를 사용하여 사용자 인증 시스템을 구현하는 방법을 살펴보았습니다. 우리는 로그인, 회원가입, 로그아웃 API를 생성하고 프론트엔드에서는 사용자 인터페이스를 구성했습니다.

사용자 인증은 웹 애플리케이션에서 매우 중요한 기능입니다. 이를 통해 사용자의 개인정보와 데이터 안전성을 높일 수 있습니다. 추가적으로 JWT를 사용하여 인증 상태를 유지하고, Refresh Token과 같은 기능을 구현하면 더욱 안전한 인증 시스템을 만들 수 있습니다.

앞으로 이 시스템에 추가할 수 있는 기능들로는 비밀번호 찾기, OAuth 인증(구글, 페이스북 등), 사용자 권한 관리 등이 있습니다. 이러한 기능들을 통해 더 강력하고 유용한 인증 시스템으로 발전시킬 수 있습니다.

42.Nest.js와 Next.js에서 웹소켓 활용하기, Nest.js에서 실시간 통신 구현하기

이번 강좌에서는 Nest.js와 Next.js를 활용하여 실시간 통신을 구현하는 방법에 대해 설명하겠습니다. 웹소켓(WebSocket)은 클라이언트와 서버 간의 양방향 통신을 가능하게 하는 프로토콜입니다. 이를 통해 정보를 실시간으로 주고 받을 수 있으며, 특히 채팅 애플리케이션, 실시간 대시보드 등과 같은 응용 프로그램에서 유용합니다.

1. 웹소켓의 기초 이해

웹소켓은 HTTP 기반의 통신 채널로, 매번 연결을 새로 여는 대신에 한 번 연결된 이후로 지속적인 연결을 유지하여 양방향 통신을 가능하게 합니다. 이로 인해 클라이언트와 서버 간의 데이터 전송 속도가 빨라지고, 불필요한 오버헤드가 줄어드는 장점이 있습니다.

1.1 웹소켓의 동작 구조

1. 클라이언트가 WebSocket 서버에 연결 요청.
2. 서버는 요청을 수락하여 연결을 완성.
3. 클라이언트와 서버가 연결된 후 양방향으로 데이터 전송.
4. 클라이언트 또는 서버가 연결을 종료.

2. Nest.js에서 웹소켓 구현하기

Nest.js는 Node.js를 위한 프레임워크로, 웹소켓을 쉽게 구현할 수 있도록 도와주는 ‘socket.io’ 패키지를 지원합니다. 먼저 Nest.js 프로젝트를 생성하고 필요한 패키지를 설치하는 방법을 알아보겠습니다.

2.1 Nest.js 프로젝트 생성

npm install -g @nestjs/cli
nest new websocket-demo
cd websocket-demo

2.2 필요한 패키지 설치

웹소켓 기능을 사용하기 위해 socket.io와 관련 패키지를 설치합니다:

npm install --save @nestjs/platform-socket.io socket.io

2.3 웹소켓 모듈 생성

웹소켓을 구현하기 위해 새로운 모듈과 서비스를 생성합니다:

nest g module chat
nest g service chat
nest g gateway chat

2.4 웹소켓 게이트웨이 구현

생성된 chat.gateway.ts 파일을 다음과 같이 수정하여 웹소켓 기능을 구현합니다:

import { WebSocketGateway, WebSocketServer, SubscribeMessage, WebSocketIconService } from '@nestjs/websockets';
import { Server } from 'socket.io';

@WebSocketGateway()
export class ChatGateway {
  @WebSocketServer() server: Server;

  @SubscribeMessage('message')
  handleMessage(client: any, payload: { sender: string; content: string }): void {
    this.server.emit('message', payload);
  }
}

2.5 서비스에 로직 추가

chat.service.ts에 비즈니스 로직을 추가하여 더 복잡한 기능을 구현할 수 있습니다. 예를 들어, 사용자 목록 관리, 메시지 저장 등을 추가할 수 있습니다.

3. Next.js에서 웹소켓 클라이언트 구현하기

Next.js에서는 브라우저에서 웹소켓 서버와 통신하는 클라이언트를 쉽게 생성할 수 있습니다. socket.io-client 패키지를 사용하면 기존의 socket.io 서버와 쉽게 연결할 수 있습니다.

3.1 Next.js 프로젝트 생성

npx create-next-app websocket-client
cd websocket-client
npm install socket.io-client

3.2 웹소켓 클라이언트 구현

Next.js의 pages/index.tsx 파일을 수정하여 웹소켓 연결을 구현합니다:

import { useEffect, useState } from 'react';
import { io } from 'socket.io-client';

const socket = io('http://localhost:3000'); // Nest.js 서버의 주소

export default function Home() {
  const [messages, setMessages] = useState([]);
  const [input, setInput] = useState('');

  useEffect(() => {
    socket.on('message', (message) => {
      setMessages((prev) => [...prev, message]);
    });

    return () => {
      socket.off('message');
    };
  }, []);

  const sendMessage = () => {
    socket.emit('message', { sender: 'User', content: input });
    setInput('');
  };

  return (
    

WebSocket Chat

{messages.map((msg, index) => (
{msg.sender}: {msg.content}
))}
setInput(e.target.value)} placeholder="Type a message" />
); }

4. Nest.js와 Next.js 연결하기

Nest.js 서버를 실행하고 Next.js 클라이언트를 통해 연결하면, 클라이언트가 Nest.js 서버와 실시간으로 메시지를 주고받을 수 있습니다. 이를 통해 간단한 채팅 애플리케이션을 구현할 수 있습니다.

4.1 Nest.js 서버 실행

npm run start

4.2 Next.js 클라이언트 실행

npm run dev

브라우저에서 http://localhost:3000에 접속하면 웹소켓 클라이언트가 실행되고, 다른 브라우저에서 같은 주소로 접속하여 메시지를 주고받는 실시간 통신이 가능해집니다.

5. 결론

Nest.js와 Next.js를 활용하여 간단한 웹소켓 기반의 실시간 통신 애플리케이션을 만들 수 있었습니다. 웹소켓은 실시간 데이터를 전달하는데 매우 유용하며, 다양한 분야에서 활용될 수 있습니다. 본 강좌를 통해 여러분이 웹소켓의 기초를 이해하고, Nest.js와 Next.js에서 쉽게 구현할 수 있는 방법을 배울 수 있었기를 바랍니다.

6. 추가적인 학습 자료

4.Next.js와 Nest.js 기본 프로젝트 구조 만들기, Next.js와 Nest.js 기본 폴더 구조 이해

이번 포스트에서는 Next.jsNest.js를 이용하여 기본 프로젝트 구조를 만드는 방법에 대해 자세히 알아보겠습니다. JavaScript와 TypeScript를 사용하는 프레임워크인 이들 두 가지는 웹 개발에서 인기가 높습니다. Next.js는 React 기반의 프레임워크로, 탁월한 SSR(Server-Side Rendering)과 정적 페이지 생성을 지원하며, Nest.js는 Angular에서 영감을 받아 집약된 구조로 웹 애플리케이션을 구축하는 강력한 서버 사이드 프레임워크입니다. 이 두 가지 프레임워크를 결합하여 전체 스택 애플리케이션을 구축할 때 고려해야 할 기본적인 폴더 구조에 대해 알아보겠습니다.

1. 프로젝트 생성

먼저 Next.js와 Nest.js 프로젝트를 생성합니다. 각 프레임워크별로 CLI(Command Line Interface)를 통해 쉽게 프로젝트를 설정할 수 있습니다.

1.1 Next.js 프로젝트 생성

npx create-next-app@latest my-next-app

위의 명령어를 실행하면 my-next-app이라는 이름의 새 Next.js 프로젝트가 생성됩니다. 생성된 폴더로 이동합니다.

cd my-next-app

1.2 Nest.js 프로젝트 생성

npm i -g @nestjs/cli

위의 명령어로 Nest CLI를 설치한 후, 아래와 같이 새로운 Nest.js 프로젝트를 생성합니다.

nest new my-nest-app

생성된 폴더로 이동합니다.

cd my-nest-app

2. 기본 폴더 구조 이해

각 프레임워크의 기본 폴더 구조를 알아보겠습니다. 특정한 폴더 구조는 프로젝트의 유지 관리 및 확장성을 높이는 데 도움이 됩니다.

2.1 Next.js 기본 폴더 구조

Next.js 프로젝트의 기본 구조는 다음과 같습니다:


my-next-app/
├── node_modules/
├── public/
│   ├── favicon.ico
│   ├── vercel.svg
├── styles/
│   ├── globals.css
│   └── Home.module.css
├── pages/
│   ├── api/
│   ├── _app.js
│   ├── index.js
└── package.json
  • node_modules: 프로젝트에서 사용하는 모든 의존성이 설치되는 디렉토리입니다.
  • public: 정적 파일을 저장하는 곳으로, 예를 들어 이미지나 글꼴을 저장합니다.
  • styles: CSS 파일을 저장하는 폴더로, 각 컴포넌트에 대한 스타일을 정의할 수 있습니다.
  • pages: Next.js의 라우팅을 담당하는 폴더로, api 폴더 안에는 API 라우트가 포함됩니다. 또한 _app.js는 애플리케이션의 레이아웃을 정의하는 데 사용됩니다.
  • package.json: 프로젝트의 메타데이터 및 스크립트, 의존성을 정의하는 파일입니다.

2.2 Nest.js 기본 폴더 구조

Nest.js 프로젝트의 기본 구조는 다음과 같습니다:


my-nest-app/
├── src/
│   ├── app.module.ts
│   ├── app.controller.ts
│   ├── app.service.ts
└── package.json
  • src: 애플리케이션의 소스 코드가 포함되는 폴더입니다. 기본적으로 app.module.ts, app.controller.ts, app.service.ts 파일이 생성됩니다.
  • app.module.ts: 루트 모듈로, 애플리케이션의 구성 요소를 가져오고 종합합니다.
  • app.controller.ts: 클라이언트의 요청을 처리하는 컨트롤러입니다.
  • app.service.ts: 비즈니스 로직을 구현하는 서비스입니다.
  • package.json: 의존성 관리 및 빌드 스크립트가 포함됩니다.

3. Next.js와 Nest.js 연결하기

Next.js와 Nest.js를 모두 설치한 후, 이 두 가지를 연결하여 전체 스택 애플리케이션을 만드는 과정에 대해 설명하겠습니다.

3.1 Nest.js API 개발

우선 Nest.js를 사용하여 API를 개발합니다. 여기에 간단한 사용자 정보를 관리하는 API를 만들어 보겠습니다. app.controller.ts 파일을 다음과 같이 수정하겠습니다.


import { Controller, Get } from '@nestjs/common';

@Controller('users')
export class AppController {
    @Get()
    findAll(): string {
        return '사용자 리스트';
    }
}

3.2 Next.js에서 API 사용하기

이제 Next.js에서 위에서 만든 Nest.js API를 호출해봅시다. pages/index.js 파일을 다음과 같이 수정합니다.


import { useEffect, useState } from 'react';

export default function Home() {
    const [users, setUsers] = useState([]);

    useEffect(() => {
        fetch('/api/users')
            .then((response) => response.json())
            .then((data) => setUsers(data));
    }, []);

    return (
        

사용자 리스트

    {users.map((user) => (
  • {user.name}
  • ))}
); }

4. 결론

Next.js와 Nest.js의 기본 프로젝트 구조 및 폴더 구조에 대해 알아보았습니다. 이러한 구조는 애플리케이션의 유지 관리를 더 쉽게 만들고, 개발자들이 더 나은 협업을 할 수 있도록 도와줍니다. 또한, 이번 포스트는 Next.js와 Nest.js를 연동하여 API를 호출하는 방법도 간단히 보여 주었습니다. 이 두 기술 스택을 이용해 다양한 웹 애플리케이션을 개발할 수 있으니, 앞으로 더 많은 기능을 추가해 보세요. 감사합니다!