Back-end/Spring

    [Spring/fairer] 반복 기능 api 개발 - 조회

    반복 기능 구현 방법을 설계하고, 나는 조회 api를 담당했다. 반복기능 구현 전 집안일 api 에서도 조회를 담당했는데, 굉장히 비효율적으로 구현했던 전적이 있어서 이번에는 개선해 보고자 도전했는데 … fromDate ~ toDate에 속한 집안일을 조회하려면 반복 종류에 따라서 ONCE (반복x) scheduled_date가 조회 범위 안에 속하는지 확인 DAILY (매일 반복) scheduled_date ~ end_date가 조회 범위와 겹치는 구간이 있는지 확인 repeat_exception 테이블에 조회할 날짜가 등록되어 있는지 확인 WEEKLY (요일 반복) scheduled_date ~ end_date가 조회 범위와 겹치는 구간이 있는지 확인 (repeat_pattern에 저장된 요일 == ..

    [Spring/fairer] 반복 기능 api 설계

    반복 기능은 fairer를 개발하며 가장 신경써야할 부분이 많았던 기능이다. 일/주/월 단위로 반복되는 집안일을 관리해야하고, 수정&삭제를 할 때에도 반복 일정 모두 삭제/오늘 일정만 삭제/ 앞으로 예정된 집안일만 삭제 등 선택지가 많았다. 반복기능을 어떻게 개발할 것인지 설계하는 데에만 몇 주를 사용했던 것으로 기억한다. 4명의 의견이 모두 달랐어서 신기했고, 배울점도 많았던 기능이다. 의견1 새로운 테이블을 추가하지 않고, 기존 housework 테이블에 주기 칼럼만 추가 생성 : 기존 집안일 생성과 동일, 주기 칼럼에 주기만 추가하여 생성 조회 : 해당 날짜에 포함되는 집안일(반복x) 조회 반복되는 집안일 중 반복 요일이 같고, 시작 날짜~종료 날짜 안에 해당 날짜가 포함된 집안일 조회 수정 : 집..

    [Spring/Data JPA] 인터페이스 기능

    😊 순수 JPA 기반 레포지토리 만들기 ▪ 순수 jpa 기반 레포지토리 @Repository public class MemberJpaRepository { @PersistenceContext private EntityManager em; public Member save(Member member) { em.persist(member); return member; } public void delete(Member member) { em.remove(member); } public List findAll() { return em.createQuery("select m from Member m", Member.class) .getResultList(); } public Optional findById(Long..

    [Spring/Data JPA] 프로젝트 환경설정

    🌝 프로젝트 환경설정 preference → Build and run IntelliJ IDEA로 변경하기 enable annotation option 체크 🌝 h2 데이터베이스 설치 spring.io 들어가서 h2 database와 spring version 일치하는지 확인 chmod 755 h2.bat 권한주고 ./h2.bat /datajpa.mv.db 파일 생성 확인 → jdbc:h2:tcp://localhost//datajpa 이렇게 접속! 🌝 스프링 데이터 JPA와 DB 설정, 동작확인 Member entity, MemberJpaRpository 작성 @Entity @Getter @Setter public class Member { @Id @GeneratedValue private Long id;..

    [Spring] 스프링 Bean과 의존관계 - 컴포넌트 스캔 & 자동 의존관계 vs 스프링 Bean 직접 등록

    Spring Bean이란? → Class와 new를 통해 생성된 객체가 아닌, Spring에 의하여 생성되고 관리되는 자바 객체 의존관계란? 예를 들어, Controller와 view template가 필요한 상황 → memberController 생성해야함 → memberService를 통해 회원가입을 하고, data를 조회해야함 ↔ 의존관계가 있다! 🌳 컴포넌트 스캔과 자동 의존관계 설정 1. MemberController 생성, 의존관계 추가 @Controller public class MemberController { private final MemberService memberService; @Autowired public MemberController(MemberService memberSer..

    [Spring] 회원 관리 예제 02 - 회원 서비스 개발 → Test Code 작성

    🌳 회원 Service 개발 회원가입 수정 전 @Service public class MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); // 회원가입 public Long join(Member member){ Optional result = memberRepository.findByName(member.getName()) result.ifPresent(m -> { throw new IllegalStateException("이미 존재하는 회원입니다."); }); return member.getId(); } ▪ @Service 어노테이션을 통해 스프링 컨테이너에 등록된다 ▪ ifPrese..

    [Spring] 회원 관리 예제 01 - 비즈니스 요구사항 정리, domain & repository 생성 → Test code 작성

    🌳 비즈니스 요구사항 정리 데이터 : 회원ID, 이름 기능 : 회원 등록, 회원 조회 DB : 아직 어떤 DB를 사용할지 정해지지 않은 가상의 시나리오 ▪ 따라서 인터페이스로 구현 클래스를 변경할 수 있도록 설계 → 구현체를 통해 가벼운 메모리 기반의 데이터 저장소 사용 ▪ 테스트 프레임워크 → junit 일반적인 웹 애플리케이션 계층 구조 ▪ controller → 웹 MVC의 컨트롤러 역할 ▪ service → 핵심 비즈니스 로직 구현 ▪ repository → 데이터베이스에 직접 접근, 도메인 객체를 DB에 저장하고 관리 → Node에서 사용했던 model과 비슷한 역할이라고 생각하면 될 듯 하다 ▪ domain → 비즈니스 도메인 객체 → 회원, 주문 등등 주로 DB에 저장하고 관리되어지는 객체 ..

    [Spring] 정적 컨텐츠, MVC와 템플릿 엔진, API

    🌳 웹 개발 기초 정적 컨텐츠 서버의 관여없이 파일을 그대로 웹브라우저에 내려주는 컨텐츠 ex) welcome page MVC와 템플릿 엔진 서버에서 프로그래밍하여 동적으로 바꾸어 내려주는 컨텐츠 controller, model, view등의 패턴이 필요 ex) jsp, php API JSON 데이터 포맷을 사용하여 클라이언트에게 정보를 전달하는 방식 🌳 정적 컨텐츠 스프링은 정적 컨텐츠 기능을 자동으로 제공한다 → 원하는 파일을 넣으면 그대로 반환이 된다 hello-static.html 정적 컨텐츠 입니다. [동작 과정] 내장 톰캣서버가 요청을 받아 스프링에게 넘긴다 controller 내에서 hello-static을 찾는다 controller에 없으면 resources에서 hello-static을 찾..

    [Spring] 환경 구축, 라이브러리, thymeleaf 템플릿 엔진 동작 원리

    🌳 프로젝트 생성 java 11 설치 Maven / Gradle Project Maven → pom.xml을 이용하여 정형화된 빌드 시스템을 제공 Gradle → 유연한 범용 빌드 도구 제공 Gradle이 시기적으로 늦게 나온만큼 뛰어난 스펙을 갖고있고, 동적인 빌드 시스템을 xml로 정의하기에는 어려운 부분이 많다 ↔ 요즘은 다들 Gradle로 넘어오는 추세라고 한다. Spring boot Spring boot를 통해 간단하게 프로젝트를 생성할 수 있다. main과 test 디렉토리를 나누는것이 요즘 디폴트 test에는 작성한 코드들에 대한 테스트코드들이 들어가는데, 실무에서 빠질 수 없는 매우 중요한 코드라고 한다. resources에는 설정파일이 위치하는데, java파일을 제외한 모든 파일들이 위치..