in

Software development blog

Field notes from the Puncharsoft team on SAP, enterprise application development, integration and digitalization.

Hexagonal architecture diagram with the domain at the center surrounded by ports and adapters

Hexagonal Architecture in Spring Boot: Ports and Adapters

In a layered architecture the business rule depends on JPA and HTTP; hexagonal architecture inverts that dependency. We walk through the port and adapter structure in Spring Boot, the package layout, a dependency rule protected by ArchUnit, the cost of separating domain from JPA entities, and which projects this architecture actually pays off in, with code.

Diagram showing a business row and an outbox row written in one transaction and relayed to Kafka

Outbox Pattern with Spring Boot and Kafka: Reliable Events

Writing to the database and publishing to Kafka are two separate operations, and a crash between them leaves systems inconsistent. The outbox pattern solves this dual-write problem with one transaction. We cover a polling relay in Spring Boot, CDC with Debezium, ordering and idempotency guarantees and day-two operations, with code.

Diagram of RAG and tool-calling flows between an enterprise application, an LLM gateway and a model

LLM Integration in Enterprise Software: 4 Safe Patterns

Taking an LLM from a chat box into a business process starts with four patterns: schema-bound structured output, RAG over company data, tool calling with clear limits, and input/output guardrails. With Spring AI examples, an LLM gateway architecture, model choice under privacy constraints and measuring with an evaluation set.

Template showing the ten sections of a software requirements specification

How to Write a Software Requirements Specification: Template

Proposals obtained without a specification cannot be compared, and the scope debate lasts until it kills the project. We share the ten sections of an enterprise software specification, the rules for writing testable requirements, an acceptance-criteria example and a pre-RFP checklist.

Diagram of many virtual threads running on a few carrier threads

Java 21 Virtual Threads in Spring Boot: Where the Gain Is

Virtual threads don't make the CPU faster; they stop waiting requests from consuming threads. How to enable them in Spring Boot with one line, which I/O-heavy scenarios show measurable gains, and the pitfalls — pinning, connection-pool bottlenecks, ThreadLocal bloat — with code.

Integration diagram showing synchronous, asynchronous and batch data flows between an application and an ERP

ERP Integration Architecture: Sync, Async and Event-Driven

ERP integration is the real work in most enterprise projects, and it's where they most often fail. When to choose synchronous APIs, asynchronous messaging or batch transfer, how an anti-corruption layer keeps the ERP model out of your application, and the reliability patterns — outbox, idempotency, reconciliation — that keep data flowing.

Diagram showing how the Spring @Transactional proxy wraps method calls

Spring @Transactional Pitfalls: 8 Common Mistakes and Fixes

@Transactional is not an annotation, it is a proxy — and most bugs come from forgetting that. Self-invocation, no rollback on checked exceptions, REQUIRES_NEW exhausting the connection pool, what readOnly really does and transaction behavior that misleads in tests, with code.

Chart showing the relative weight of factors that determine enterprise software cost

Enterprise Software Development Cost: 9 Factors Explained

The honest answer to "how much will it cost?" is "it depends on scope" — but the factors that set the scope are known. We cover the nine factors that drive the price, person-day math, fixed-price versus time-and-materials contracts, and the line items that never show up in proposals.

Diagram of a modular monolith with module boundaries enforced by Spring Modulith

Modular Monolith with Spring Modulith: Enforcing Boundaries

A modular monolith only stays modular if its boundaries are enforced at build time. We walk through Spring Modulith's module rules, verification test, event-driven communication with the publication registry, module-level tests and generated documentation, with code.