Back-End/JavaSpring 17

클린코드로 프로젝트 리팩토링하기 (DRY 원칙, SRP, 가독성)

프로젝트 리팩토링을 진행하였습니다! 미래의 나에게 큰 고통을 주면 안되기에.... 편한 유지보수를 위해서, 가독성 높은 코드를 작성하기 위해서 MVP 개발이 완료된 지금 시점에서 리팩토링을 진행하는 것이 맞다고 생각하였다. 중복되는 코드를 리팩토링한 사례를 바탕으로 설명하자면, 우리 서비스는 모임이라는 그룹이 존재한다.계정 자체의 권한은 JWT로 관리하여 @Secured 어노테이션으로 권한을 체크 하지만,모임 유저의 권한 체크는 따로 로직을 구현해야 해서 아래와 같은 코드가 존재한다.//권한을 체크 (feignClient)if(!roleCheckClient.checkRole(organizationId,userTrackingId,roles).getData()){ log.info("권한 체크 결과는 ..

Back-End/JavaSpring 2025.04.28

MSA에서 채팅 개발하기 (Spring, STOMP, Kafka, MongoDB, MySQL) - MongoDB 세팅 #3

MongoDB 세팅을 진행하자! 의존성 추가해주고 시작//mongoDBimplementation 'org.springframework.boot:spring-boot-starter-data-mongodb' MongoConfig 설정 MongoConfig설정을 해주지 않아도, MongoRepository를 상속받아서 사용하는 것도 가능하지만,동적 쿼리 문제를 해결하려면 MongoTemplate의 도움을 받아야 하기 때문에MongoConfig설정을 따로 해주었다. //MongoConfig 클래스를 작성하지 않고 MongoRepository를 상속받아서 사용하는 것도 가능하지만,//동적 쿼리 문제를 해결하려면 MongoTemplate의 도움을 받아야 하기 때문에 저는 설정 클래스를 따로 만들어 주었습니..

Back-End/JavaSpring 2025.04.17

MSA에서 채팅 개발하기 (Spring, STOMP, Kafka, MongoDB, MySQL) - STOMP 세팅 #2

이어서 STOMP 세팅을 하겟슴다 //STOMPimplementation 'org.springframework.boot:spring-boot-starter-websocket'implementation 'org.webjars:webjars-locator-core'implementation 'org.webjars:sockjs-client:1.5.1'implementation 'org.webjars:stomp-websocket:2.3.4'implementation 'org.webjars:bootstrap:5.2.3'implementation 'org.webjars:jquery:3.6.4'  이건 STOMP 의존성을 추가한 것이다.  WebSocketConfig 설정 @Configuration@RequiredA..

Back-End/JavaSpring 2025.04.13

MSA에서 채팅 개발하기 (Spring, STOMP, Kafka, MongoDB, MySQL) - Kafka 세팅 #1

본격 적인 채팅을 개발하기 앞서서 카프카 기본 설정을 해주겠다. 나중에 내가 다시 채팅을 개발할 것이라는 다짐으로 최선을 다해서 작성할 예정인데,,, 솔직히 자신은 없다..   참고로, 이는 카프카 개념공부가 아닌,기본 설정환경을 이야기하는 것이므로, 앞으로 나올 모든 게시글에서 언급되는그룹id, producer, consumer 와 같은 개념은설명하지 않고 넘어가도록 하겠습니다..  Kafka 의존성 추가 implementation 'org.springframework.kafka:spring-kafka'testImplementation 'org.springframework.kafka:spring-kafka-test'//이건 ImmutableMap 사용하려고 추가한건데 나중에 kafka 설정에 필요한 것..

Back-End/JavaSpring 2025.04.13

QueryMethod, JPQL, QueryDSL 중에서 어떤것을 사용할까

항상 개발할때 마다QueryMethod, JPQL, QueryDSL 중에서어떤 상황에서 어떤걸 사용해야 할지 몰라서, 아무거나 기분 내키는 대로 선택해서 사용하곤 했다. 그 중에서도조회/검색/필터링 기능은JPQL, QueryDSL을 사용해서 개발하였다. 기술 선택의 근거와 명분이 없는 잘못된 방식인걸 알지만,,,개발에 급급하느라 그냥 그런거 신경안쓰고 아무거나 골라쓰는 경우가 태반이었다...   JPQL을 사용해도 되고, QueryDSL을 사용해도 되는데,상황별로 어떤 기준을 갖고, 어떤 기술스택을 사용해야 할지 명확히 정리가 된거같지 않아서 내 나름대로 정리를 하고, 구현해보려고 한다. 이 3가지 방법들은Spring Data JPA를 사용하면서, 데이터베이스 쿼리를 작성하는 데 활용되는 대표적인 방법들..

Back-End/JavaSpring 2025.04.10

Entity, 영속성 컨텍스트 알아보기

Entity란,JPA에서 관리되는 클래스 즉, 객체를 의미합니다.Entity 클래스는 DB의 테이블과 매핑되어 JPA에 의해 관리됩니다. Entity는 이렇게 만들면 된다.   @Entity // JPA가 관리할 수 있는 Entity 클래스 지정@Table(name = "memo") // 매핑할 테이블의 이름을 지정public class Memo { @Id private Long id; // nullable: null 허용 여부 // unique: 중복 허용 여부 (false 일때 중복 허용) @Column(name = "username", nullable = false, unique = true) private String username; // length: 컬럼..

Back-End/JavaSpring 2025.04.01

Bean과 Spring IoC 컨테이너

Bean이란, 스프링이 관리하는 객체를 뜻한다.Spring IoC 컨테이너는 Bean을 모아둔 컨테이너이다 DI를 사용하기 위해서는 객체 생성을 해야하는데,Spring 프레임워크가 필요한 객체를 생성하고 관리하는 역할을 대신 해준다. Spring IoC 컨테이너에 Bean을 어떻게 등록하고 사용하는지 알아보자  @Component‘Bean’으로 등록하고자하는 클래스 위에 @Component 어노테이션을 붙이면Spring 서버가 실행되면, IoC컨테이너에 Bean을 저장해준다  그러면, 이 사진처럼 bean(콩)이미지가 뜨는데,Spring IoC 컨테이너에서 관리하는 Bean으로 등록되었다는 것을 알 수 있다. @Configuration@ComponentScan(basePackages = "com.spar..

Back-End/JavaSpring 2025.03.31

JDBC가 등장한 이유와 JPA로 넘어간 이유

JDBC는 자바 개발자로서 한번 쯤은 들어봤을 단어이다 우리는 JDBC의 중요함을 알아야 한다.우리에게 아주 큰 편의를 제공해주고 있기 때문이다!   서버 개발자로서,JDBC는 무엇이고, 왜 필요한지, 어디에 사용되고 있는지 알고가자!JPA가 등장한 이유도 알면 좋겟져?  JDBC 등장 이유 우리는 DB에 접근해서 데이터를 달라는 요청을 보통 아래 그림과 같은 방식으로 한다.  이런 과정들이 성공적으로 이루어져야, DB로 부터 우리가 원하는 데이터를 받을 수 있다.(모두 경험해봤겠지만, DB를 수작업으로 연결하는건 어려울 걸..?)  그런데 만약, MySQL로 개발을 잘 하고 있다가,갑자기 개발팀장이 "우리 팀은 MySQL에서 postgreSQL로 마이그레이션 하겠습니다" 라고 한다면 어떤 기분이 들까?..

Back-End/JavaSpring 2025.03.20

MSA에서 API gateway를 통한 인증/인가를 처리하는 방식

MSA 아키텍처를 기반으로 프로젝트를 진행하다보니,고려해야할 사항이 한두가지가 아니다.   그 중에서도 먼저 가장 먼저 짚고 넘어가야할, 인증/인가 방식에 대해서 이야기해보려고한다. 이번 프로젝트에서 우리 팀은, spring cloud를 사용하여 MSA를 구성하려고 한다. 그중에서도 Eureka Discovery Server를 사용하여 어플리케이션 discovery 서버를 구축하고 Spring cloud gateway를 통해서 요청 라우팅 처리를 해줄 예정이다. 그리고 우리 팀이 선택한 인증/인가 방식과, 다른 팀들이 선택한 인증/인가 방식을 공유해보려고 한다    우리 팀이 선택한 인증/인가 방식  MSA 에서 인증/인가 로직을 어떻게 처리해줄까에 대한 고민을 해보았습니다.저희는 아래 그림과 같이, 인..

Back-End/JavaSpring 2025.03.14

DDD 기반 프로젝트 패키지 구조 설계 (SpringBoot)

이번 프로젝트는  "물류 관리 및 배송 시스템" 이다. 쿠팡 물류 시스템을 개발한다고 보면 될 것 같다 규모가 규모인 만큼 MSA 아키텍처로 설계하여 개발을 진행할 예정이다.    물론 서비스의 관점에서 보면 초기 빠른 개발을 통해서 MVP를 도출하려면 MSA는 적절한 아키텍처는 아니지만,대규모 트래픽을 처리하는 물류관리 및 배송 시스템을 마련해야 한다는 상황을 가정하고,개발을 시작할 것이다. 모든 주요 기능은 독립적인 마이크로 서비스로 개발할 것이고,각각의 서비스는 독립적으로 배포되고 확장, 유지보수 될 수 있도록 설계할 것이다.하지만, 모든 서비스를 MSA로 구성하지는 않을 것이다. 마이크로서비스는 보통 비즈니스 도메인에 맞춰 분리된다. 따라서 요구사항을 바탕으로 각 도메인과 마이크로서비스의 경계를 ..

Back-End/JavaSpring 2025.03.12
728x90