What is a good stack for full-stack development?
Server - Tech Stack
I prefer to develop servers using Node.js combined with Prisma ORM. As a result, codebases that rely on raw queries with
mapper.xml
files in a Spring Boot environment are not really suited to my style.From my research, it appears that while Java environments may differ, in Kotlin-based environments, using an ORM is quite standard. Since I’ve become accustomed to ORM, I generally try to avoid raw queries to maintain consistency in the codebase.
I’m still learning the best ways to effectively manage complex raw queries. This likely depends heavily on the project’s code structure.
Server - Vercel Functions
When deploying with Vercel, the free version is a bit slow (with a maximum of 1GB memory), but it takes care of infrastructure tasks such as zero-downtime deployment, allowing me to focus only on the code. Ultimately, for environments used by actual users, I recommend the paid version, and for more customization options, switching to AWS. While Vercel is excellent as an IaaS, it still has some limitations in customization for service deployment.
Server - NestJS
I’m accustomed to building Node servers from scratch using libraries like Fastify or Express. My side projects generally weren’t large enough to require the structure imposed by a framework.
However, for a structured project like those at a company, using a server framework became inevitable to maintain the codebase effectively. Nowadays, I often use NestJS for this purpose—similar to how I use Next.js.
I haven’t used NestJS extensively yet, but I plan to try it out soon!
Database - DBeaver
DBeaver is great for direct database interactions. I know there are other tools, but I prefer DBeaver. Using Supabase with PostgreSQL is also a good option since it comes with its own console. I previously used TablePlus, but I find DBeaver much better. I recommend it for database browsing and CRUD tasks!
Database - Prisma ORM
Prisma ORM has significant advantages for configuration management, allowing you to generate a
prisma.schema
based on the existing database structure through introspection. I plan to cover this topic more thoroughly in a future post. However, if the database tables are not properly normalized, managing it with an ORM can still be challenging, so it’s best to start by establishing a strong schema foundation.Note: Prisma ORM currently does not support the Point data type in MySQL.
Server - Fastify
Certain elements are crucial in server development:
- Layer separation:
- Service
- Controller
- Module
- DTO
- DTO separation for schema management
Thus, I use Fastify for server deployment, but I may gradually incorporate NestJS in the future.
- Domain structure:
domain.module.ts
- Routerdomain.service.ts
- Business logicdomain.controller.ts
- Controller that pulls in the service layer for each route, processes logic, and returns responses
I’ve become quite accustomed to this structure, which has significantly improved my productivity.
In Conclusion
Developing a service is not easy. To build a service that functions well within the larger framework of planning, policies and workflows need to be aligned, like cogs in a well-oiled clockwork mechanism. Ultimately, policies and workflows influence the data, and a developer’s job is to handle this data effectively.
Service development is challenging—but seeing a service grow with user feedback and engagement is incredibly rewarding. I plan to continue putting in the effort to create such services in the future.