Spring 프로젝트 구조 및 공통 코드 처리 방법

스프링 프로젝트 중 공통적인 처리에 대한 방법 및 코드 개선에 대한 내용에 대한 정리입니다. 알림 해당 글은 Spring으로 사내 프로젝트를 하면서 느낀 코드 개선 및 경험에 대한 내용입니다. 여러 개발 블로그의 경험과 노하우가 담긴 글을 참조하며, 추가한 내용입니다. 글의 내용이 정답이 아닐 수 있으며, 개인적인 생각으로 가볍게 읽어주세요. :D.. 프로젝트 코드 공통 처리 및 여러 Tips 참조링크 : Spring Guide - Directory 최근 프로젝트의 구조는 아래와 같습니다. 위와 같이 패키지를 domain과 global로 나누어 환경을 구축했습니다....

10월 14, 2023 · 5 분

IntelliJ에서 스프링 프로젝트 관련 설정

인텔리J에서 스프링 프로젝트를 생성하면 아래 셋팅은 미리 설정하면 좋습니다. 1. 어노테이션 프로세싱 활성화 롬복과 같은 외부 라이브러리를 의존성 주입하게 될 경우 해당 사항을 체크해줘야 컴파일 시 문제 없이 동작합니다. 설정에서 검색창에 annotation을 입력하면 아래와 같은 화면이 나옵니다. 2. Build and run IntelliJ IDEA로 변경 IntelliJ IDEA 인텔리제이 자체에서 제공하는 빌드 자동화 도구입니다. 기본은 Gradle로 설정 돼 있습니다. 이걸 IntelliJ IDEA로 변경하면 더 빠른 테스트를 할 수 있습니다. Gradle빌드와 IntelliJ IDEA 빌드의 차이는 증분 빌드 여부입니다....

7월 7, 2022 · 2 분

H2 2.1.210 Upgrade시 JPA 테스트 에러 해결 방법

H2를 최신 버전(2.1.210)으로 업데이트하니 아래와 같은 에러가 발생했습니다. 1 2 3 4 5 6 7 8 Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set ... java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124) at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190) ... 일단 임시방편으로 H2 url을 연결하는 곳에 추가적으로 옵션(;MODE=LEGACY)을 넣으면 해결됩니다. 1 url: jdbc:h2:tcp://localhost/~/test;MODE=LEGACY MODE=LEGACY를 모드를 사용하면 H2 1.X용으로 작성된 응용 프로그램에 대한 일부 호환성 기능이 활성화됩니다. Hibernate ORM에서 H2에 대해서 유효하지 않은 SQL을 생성하기 때문이라고 합니다....

1월 29, 2022 · 1 분

Spring Data JPA와 JPQL 함께 사용하기

JPQL 이란? 예전에는 JPQL은 Java Persistence Query Language로 불렸지만 현재의 JPQL은(Jakarta Persistence Query Language) 라고 합니다.(나무위키 링크 ) 2019년부터 JPA(Java Persistence API)또한 Jakarta Persistence로 변경됐습니다. 이름은 달라졌지만 역할은 달라지지 않았습니다. JPQL을 이용하여 관계형 데이터베이스의 엔티티를 정의하고 이를 활용한 쿼리 언어를 자바를 이용하여 구현합니다. 더 나아가 Querydsl을 이용하면 좀 더 직관적이고 오류 없이 자바를 이용하여 작성할 수 있습니다. 간단한 예시로 회원 조회를 하는 경우 JPQL과 Querydsl의 차이는 아래와 같습니다. JPQL 1 2 3 4 5 6 public List<Member> findAll() { EntityManager entityManager; return entityManager....

1월 17, 2022 · 2 분

Mybatis와 JPA에 대하여

Mybatis란? 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크입니다. JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화하고 일반 SQL 쿼리, 저장 프로시저 및 고급 매핑을 지원하며 모든 JDBC 코드 및 매개 변수의 중복작업을 제거 합니다. 또한 Java코드와 SQL코드를 분리하여 서로 다른 역할에 집중할 수 있게 합니다. MyBatis는 DAO(Data Access Object)인터페이스를 통해 SQL과 연결 후 VO(Value Object) 또는 DTO(Data Transfer Object)로 바로 데이터를 가져옵니다. JPA란? JPA(Java Persistence API)는 ORM(Object-Relational Mapping) 기술 표준으로 JPA가 제공하는 API를 사용하면 직접적으로 SQL을 사용하지 않고도 DB에 접근이 가능합니다....

1월 15, 2022 · 2 분

@Autowired와 @RequiredArgsConstructor 차이점

@Autowired는 필드 주입이고, @RequiredArgsConstructor는 생성자 주입(Constructor Injection) 입니다. @RequiredArgsConstructor는 Lombok에서 제공하는 어노테이션 입니다. 결론적으로 생성자 주입을 권장합니다. 인텔리제이에서 코드를 작성하다보면 @Autowired를 사용하면 아래와 같은 경고를 알려줍니다. 경고 Field injection is not recommended Inspection info: Spring Team recommends: “Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies”. 뭐.. 추천하지 않고 생성자 주입방식을 쓰라고 하는거 같네요. 생성자 주입으로 코드를 작성하면 아래와 같은 장점이 있습니다. 순환 참조 방지 테스트 코드 작성 용이 코드 악취 제거 객체 변이 방지 필드 주입방식을 쓰면 아래와 같은 단점이 있습니다....

1월 12, 2022 · 1 분

[Spring] Service와 ServiceImpl에 대해

Service, ServiceImpl Spring 프로젝트를 하면 종종 관례적으로 Service를 interface로 기능 명세를 한 뒤 ServiceImpl에 기능을 구현하게 되는 Factory Pattern을 사용하게 됩니다. interface는 기능을 추상화하여 클래스간 결합도를 낮추어 주고, 협업 시 업무분담도 용이합니다. 게임으로 예를 들면 스타크래프트에서 모든 유닛의 기본적인 특성 HP, 이동하기를 interface로 기능만 명시하고 각각 분업하여 유닛에 대한 HP나 이동속도를 구현할 수 있습니다. 하지만 일반적인 Spring 웹프로젝트에서는 Service interface는 1:1 구조인 경우가 많습니다. 만약 확장성을 고려한 1:N의 경우에는 interface로 가는 것이 좋지만 너무 막연한 경우에는 그냥 class로 생성 후 추후 시나리오 변경 또는 로직상 확장성이 필요한 경우 interface로 변경하는 것이 좋다고 생각합니다....

12월 22, 2021 · 2 분