분류 전체보기

프로젝트 개발을 시작하기에 앞서 기능 역할 분담을 하고 있었다. 프로그래머스 데브코스의 최종 프로젝트인 만큼 실시간 채팅, 위치 기반 API 등 기존에 해보지 못했던 기능들을 담당하고 싶었지만 동시에 내가 프로젝트에서 로그인/회원가입을 담당했던 적이 있었던가? 라는 생각이 들었다. 곧 데브코스의 수료를 앞두고 있었을 때라 Spring Security 및 JWT를 활용한 인증 / 인가는 한 번쯤은 제대로 경험을 해보고 싶다는 생각이 들었다. 그래서 나는 로그인 / 회원가입은 내가 해보고 싶다고 앞서 팀원들께 말씀을 드렸고 그 외의 알림, 멤버, 가족, 산책 분석 도메인 개발을 맡았다. 경험해보지 못했던 부분이라 많이 공부하고 그만큼 많은 고민을 하게 되었다. 이러한 내용을 기록하기 위해 이번 포스팅을 작성..
프로그래머스 데브코스에서 IT 취업 준비생을 위한 채용 맞춤형 뉴스레터를 개발하던 도중 트러블 슈팅이다. 사람인 채용 정보 API를 호출하여 채용 정보를 얻어오고 회원이 입력한 키워드에 맞게 필터링을 하여 맞춤화된 채용 정보를 제공하는 기능 구현에 있어서 Spring Batch를 사용하였다. Spring Batch는 대용량 데이터 처리를 위한 프레임워크로, 배치 작업을 효율적으로 처리할 수 있게 도와준다. 주로 데이터베이스에서 데이터를 읽어와 처리한 후 다시 저장하는 등의 작업에 적합하며, 대규모 데이터를 한 번에 처리해야 하는 경우 많이 사용된다. Spring Batch에서는 작업 단위를 Job이라고 부르고, 이 Job은 여러 개의 Step으로 구성된다. 각 Step은 읽기(Read), 처리(Proce..
1. 서론최근 프로그래머스 데브코스 프로젝트에서 Spring Batch를 사용하여 사용자 맞춤형 채용 공고 필터링 작업의 테스트를 진행하던 중, 두 번째 Job 실행 시 필터링된 데이터가 정상적으로 저장되지 않는 문제를 경험했다. 이 문제는 Spring Batch의 기본 특성과 관련된 것이었고, 이를 해결하는 과정에서 많은 것을 배우게 되었고, 이를 기록하기 위해 글을 작성한다. 참고로 아래에서 설명할 Spring Batch는 상세한 설명보단 간략히 요약한 정도이다. 트러블 슈팅을 다룬 글인 만큼 문제 발생과 이를 해결하는 과정에 집중해서 글을 작성하기 위해 Spring Batch의 상세한 설명은 Spring 공식 문서를 참고하길 바란다.  2. Spring Batch란?Spring Batch 기본 개념..
· SPRING
SpringMVC 구조로 개발을 할 때 Service 계층을 Service, ServiceImpl 즉 인터페이스와 구현체로 구분하여 개발을 하던 중 이것이 단순히 관습적인 구조로 인한 것인지 아니면 정말 근거를 가지고 작성을 했던 건지 스스로를 되돌아보게 되었다. 이 주제는 정말 다양한 측면에서 생각해 볼 수 있는 문제이고, 상황에 따라 수많은 의견이 분분한 주제이므로 정답은 없다고 생각한다.하지만 이번 주제에 대해서든, 그게 아니더라도 어떠한 구조든 적용했을 때는 그만한 근거를 가지고 이유를 알고 사용해야 유의미하다고 생각하기에 이번 글에서 그 이유에 대해 정리해보려고 한다. 객체지향 설계의 관점에서 본 Service, ServiceImpl객체지향 설계의 대표적인 원칙인 SOLID를 먼저 살펴볼 필요가..
· DB
최근에 프로그래머스 데브코스에서 팀 프로젝트를 진행하던 중 외래키를 사용하지 말자는 팀원분의 의견이 있었다. 나로서는 처음 듣는 내용이었다. 외래키가 없다면 연관관계 매핑을 어떻게 해야 하는 거지..?라는 생각이 들었고 실제로 찾아본 후 많은 기업에서 외래키를 지양하는 것을 확인하였고, 이에 대해 더 자세히 알아보게 되었다. 외래키를 사용하는 이유1. 외래키의 가장 큰 장점으로는 데이터가 일련되고 정합성이 지켜지는 것이다.외래키 없어 데이터 정합성을 지키기 위해서는 애플리케이션단에서 코드를 통해 이것을 지켜야 한다. 하지만 이러한 방법은 시간이 지남에 따라 한계를 보일 수밖에 없고 결국 외래키가 없는 상태에선 시간이 지날수록 데이터 정합성이 조금씩 깨지기 시작한다. 2. 스키마를 통해 각 테이블간의 관계..
· JPA
JPA에서 중요한 것은 "객채와 관계형 데이터베이스 테이블이 어떻게 매핑되는지를 이해하는 것"이라고 할 수 있다.JPA의 목적인 "객체 지향 프로그래밍과 데이터베이스 사이의 패러다임 불일치를 해결"이라는 것과 가장 직접적으로 연관되어 있기 때문이다. JPA에서는 두 엔티티 사이의 연관 관계를 정의할 때 기본적으로 단방향으로 정의한다. 이로 인해 DB 테이블에서 외래키를 기준으로 하여 조인한다. 두 테이블 간의 연관된 데이터를 조회할 수 있는 것과 달리 JPA에서 단방향 연관 관계가 정의된 상태에서는 한쪽 엔티티 객체는 연관 관계인 엔티티 객체를 조회할 수 있으나, 반대쪽 엔티티 객체는 어떤 엔티티 객체와 연관 관계를 갖는지 알 수 없다. 이로 인해 JPA에서는 비즈니스 로직, 비즈니스 요구사항 등 필요..
· JPA
PK를 나타내기 위해 @Id 를 사용하고, 생성 전략을 정의하기 위해 @GeneratedValue 를 사용한다.이 두 개의 어노테이션을 가지고 기본키 생성 전략을 알아보고자 한다. @Id엔티티 클래스에서 해당 필드가 데이터베이스의 기본 키 역할을 한다는 것을 명시한다.이 어노테이션이 지정된 필드는 엔티티의 고유 식별자로 사용되며, 데이터베이스에서 레코드를 고유하게 식별하는 데 사용된다public class Member { @Id @Column(name = "member_id") // 컬럼명 따로 지정 private Long id;}@Column 을 활용하여 테이블의 PK 컬럼을 따로 지정할 수도 있다. 이때, 컬럼명을 따로 지정하지 않으면, 관례에 따라 매핑되는 테이블 컬럼명은 camelC..
· SPRING
사용자의 전달값을 핸들러의 매개변수로 매핑할 때 사용되는 @RequestParam과 @ModelAttribute에 대해 평소 모호하게 느껴졌던 부분을 정확하게 이해하기 위해 이번 글을 작성하게 되었다. @RequestParam@RequestParam 어노테이션은 사용자가 요청 시 전달하는 값을 Handler(Controller)의 매개변수로 1:1 매핑할 때 사용하는 어노테이션이다. HTTP 요청 파라미터를 받아오기 위해 사용되고, 따라서 Body를 직접 조회하지 않는다.@Controllerpublic class TestController { @GetMapping("/") public String getTestPage(@RequestParam("name") String name) { ..