Spring 16

멀티 모듈 프로젝트 구조와 설계(#SpringBoot#Gradle)

본 글은 실전! 멀티 모듈 프로젝트 구조와 설계 | 인프콘 2022에서 들은 내용을 바탕으로 작성한 글이다. 현업에서의 멀티모듈 개발 환경에서 필요한 팁들을 기록해놓았다. ★Point - 정말 모든 곳에서 다 필요한가요?(= 정말 CORE, COMMON 한가요?) 1. 지속적으로 늘어나는 멀티모듈's => Core와 Common을 대체 시킬 수 있는 방법이 필요함. * 배포독립성/ 개발독립성 필요함 => Core/Common을 가볍게 경계를 나누어 다음과 같이 구성해야한다. 예시 (우리는 이렇게 모듈을 나눴어요: 멀티 모듈을 설계하는 또 다른 관점 | 인프콘2023) 아래는 springboot, gradle 기반 멀티모듈 프로젝트 예시이다. 좌(1)에서 우(2) 예시로 발전시켜나간다. 1. 배치 Job이..

Spring/SpringBoot 2024.02.12

SpringBoot 동시성 이슈 해결방법

본 글은, 스프링부트 환경에서, 데이터에 동시에 접근하게 되는 경우 트랜잭션 동시성 이슈를 해결하는 방법( 참고강의 )에 대해 설명한다. 1. Synchronized 이용 Java에서 지원해주는 synchronized를 활용하여 한개의 쓰레드만 접근 가능하게 만들어준다. //@Transcational public synchronized void decrease(Long id, Long 수량){ Stock stock = stockRepository.findById(id).orElseThrow(); stock.decrease(수량); stockRepository.saveAndFlush(stock); } 이때, Spring에서는 @Transactional을 사용하게 되면, 트랜잭션이 종료되기전에 다시 쓰레드(..

Spring/SpringBoot 2023.11.26

Nexus/FW버전/OpenShift/베어메탈/Pod(파드)

1. Nexus Repository maven 저장소와 동일한데, 서버에 직접 설치해서 라이브러리도 직접 올려놓고 쓴다고 보면 된다 FW을 비롯한 프로젝트 의존성 주입을 받기 위해 활용. pom.xml(maven) 또는 build.gradle(gradle) 파일에 명시해놓은 라이브러리들을 다운 받을 때 이용한다 2. FW버전 : Snapshot, Release... 스프링 부트의 버전 주기 SNAPSHOT -> M -> RC -> RELEASE (GA) -> SNAPSHOT (Next Version) 3. OpenShift : 가속화된 애플리케이션 개발을 위해 도커 컨테이너와 데브옵스 도구를 사용하는 쿠버네티스의 지원 배포판 -> 쿠버네티스(관리를 위한) 상위개념 오픈시프트는 베어메탈, 가상머신, 클라우..

Spring/SpringBoot 2023.02.27

Redis를 사용해서 스프링부트 캐시

https://www.youtube.com/watch?v=4YDVww8fXVA&t=1s Redis : Remote Dictionary Server의 약자('Key-Value' 구조의 데이터 저장/관리 비관계형 데이터 관리 시스템) - 인메모리 구조 - Persistence(견고함) - Programmability - Clustering - Extensibility(API 많아서 확장성 용이) - High Availiability(클러스터링이랑 같이 사용, 여러개의 서버를 사용하다가 하나가 죽었을때 사용가능) 캐시 : 자주 사용하는 데이터를 미리 보관해둠. 비용이 비싸지만 데이터를 빠르게 가져옴 캐시를 어디서 사용? => 도중에 변경 될 일이 없는 데이터베이스 조회 값 => 자주 호출되는 데이터 스프링부트..

Spring/SpringBoot 2022.06.01

SpringBoot CORS에러 해결하기

https://blog.naver.com/PostView.naver?blogId=adamdoha&logNo=222292556681&redirect=Dlog&widgetTypeCall=true&directAccess=false [Spring] PUT, DELETE 403 Issue(Invalid CORS request) CrossOrigin을 모든 곳에서 열어두면 물론 안되지만, 개발 단계에서 CORS를 설정할 때, 컨트롤러마다... blog.naver.com WebConfig.java 파일을 추가하여 한꺼번에 해결해준다. 단, Controller마다 설정을 다르게 하고 싶은경우는 @CrossOrigin 어노테이션을 활용한다. import org.springframework.context.annotatio..

Spring/SpringBoot 2022.05.01

Swagger UI를 SpringBoot 연결하기

아래 설명은 SpringBoot 2.6.7버전 및 Swagger 3.0.0버전으로 최신 버전을 다루고 있습니다. 2.X 버전의 내용도 첨부하였습니다. 1. build.gradle 파일에 dependencies부분에 아래 내용을 추가해준다. dependencies { ... //https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0' } 2. 스웨거 UI를 불러오기 위한 Config파일 생성 SwaggerConfig.java 파일을 베이스 패키지에 생성해준다. @Configuration ..

Spring/SpringBoot 2022.05.01

SpringBoot Swagger 에러 : Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

아래와 같이 dependecies를 추가하여 스웨거를 사용하려고 했는데 에러가 발생했다. Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException 사용중인 버전은 아래와 같았다. springboot : 2.6.7 swagger : 2.6.1 Spring boot 2.6버전 이후에 spring.mvc.pathmatch.matching-strategy 값이 ant_apth_matcher에서 path_pattern_parser로 변경되면서 몇몇 라이브러리(swagger포함)에 오류가 발생한다고 합니다. application.yml 에 아래 설정을 추가하면 오류가 발생 안한다고..

Spring/SpringBoot 2022.05.01

#6 SpringBoot View- (ThymeLeaf, BootStrap 설정)

HomeController로 http://localhost:8080/ 에연결하기 @Controller @Slf4j public class HomeController { @RequestMapping("/") public String home(){ log.info("home controller 로그"); return "home"; } } Controller View 와 부트스트랩 연동 1. 부트스트랩 홈페이지에 접속한다. https://getbootstrap.com/ 2. 위 파일을 넣어주어야 타임리프에 적용이 된다. 3. home.html HELLO SHOP 회원 기능 회원 가입 회원 목록 상품 기능 상품 등록 상품 목록 주문 기능 상품 주문 주문 내역

Spring/SpringBoot 2022.04.10

#5 멤버 - Service, Repository 구현

Service 계층 : Controller와 교류하기 위해 Repository에서 값을 불러옴 @Service : 서비스 계층임을 명시 @Transactional : 항상 트랜잭션 안에서 데이터를 변경해야함. readOnly 디폴트값 = false @RequiredArgsConstructor : 생성자 주입방식 구현 필드 : private final 특정Repository repository : @Autowired를 사용해도 되지만, 생성자 어노테이션으로 자동 주입. 구현 메소드 : join(Member member) : 레포지토리에 저장 findMembers() : 전체 멤버 get findOne(Long memberId) : 하나의 멤버 get by id validateDuplicateMember(M..

Spring/SpringBoot 2022.04.04

#4 Spring JPA 지연로딩 + 주의사항

모든 연관관계는 지연로딩으로 설정! (안바꿀시, 1+N문제 발생) Many to X(Many to One, Many to Many)는 디폴트값이 fetch = FetchType.EGER 이므로 모두 LAZY로 바꿔야함 다른 One to X(One to Many, One to One)는 디폴트값이 fetch = FetchType.LAZY 이므로 굳이 안바꿔줘도 된다. 예시) @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "item_id") private Item item; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id")//양방향일때 해줘야됨 private Order order; 엔티티에는..

Spring/SpringBoot 2022.04.03