kotlin의 internal은 같은 모듈 내에서만 접근 가능한 가시성 제한자 Kotlin의 가시성 제한자public // 어디서나 접근 가능 (기본값)private // 같은 파일/클래스 내에서만protected // 같은 클래스와 서브클래스에서만internal // 같은 모듈 내에서만 1. 모듈 단위 캡슐화// Module A (core 모듈)internal class DatabaseHelper { internal fun connect() { }}internal val config = Config()// Module A 내 다른 파일에서val helper = DatabaseHelper() // ✅ OKhelper.connect() // ✅ OK// Module ..
개요로컬 혹은 CI 서버에서 실제 운영 환경과 같은 디비를 사용하여 통합 테스트를 하고 싶어 TestContainers 설정을 적용했다.세부 설정은 docker-compose.yml로 관리하는게 편하여 이를 import하는 방식으로 구현했다. 환경스프링 부트 3.2.6Gradle 8.8자바 17 설정gradle에 라이브러리 추가ext { testcontainersVersion = "1.19.0"}dependencies { testImplementation "org.springframework.boot:spring-boot-testcontainers" testImplementation 'org.testcontainers:mysql' testImplementation 'org.sprin..
외부설정 문서화 yml 혹은 properties 파일에 프로퍼티 설정시 SpringBoot에 이미 정의되어 있는 document랑 자동완성을 확인할 수 있다. 개발자가 커스텀한 값들에 대해서도 문서랑 자동완성ㅇ을 지원하는 방법에 대해 알아보자. Spring Configuration Processor란? application.properties, application.yml 파일 등에 넣는 커스텀 설정의 자동 완성, 도움말 등을 지원해주는 도구이다. 실습 환경 Spring Boot 3.2.0 Gradle 8.2 라이브러리 의존성 추가 dependencies { annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'..
한 프로젝트에서 2개 이상의 DB를 연결해서 사용하기 위한 다중 DataSource 설정을 아래와 같이 했다. @Configuration @EnableTransactionManagement(proxyTargetClass = true) @EnableJpaRepositories( entityManagerFactoryRef = "aJpaEntityManagerFactory", basePackages = {"com.soap.repository"} ) public class ADbConfig { @Bean(name = "aDataSource") @ConfigurationProperties(prefix = "spring.a.datasource") public DataSource aDataSource() { retu..
기록용 직접 정의한 헤더값의 language값에 따른 예외처리 메시지 다중화 applicaiton.yml spring: messages: basename: i18n/exception encoding: UTF-8 resources/i18n/exception_eng.yml ※ 다른 포맷 사용시 그에 따른 값으로 변경 # exception_eng.yml unKnown: code: "-9999" msg: "An unknown error has occurred. SadPepe :(" userNotFound: code: "-1000" msg: "This member not exist. SadPepe :(" resources/i18n/exception_kor.yml ※ 다른 포맷 사용시 그에 따른 값으로 변경 # e..
POST 컨트롤러 호출시 @RequestBody로 요청받는 Request의 dto는 다음과 같습니다. public class Request { private String name; private ColorType colrType; private String redApple; private String greenApple; private String redOrange; private String greenOrange; //getter, setter ... public enum ColorType { RED, GREEN } colorType의 값이 RED면 redApple과 redOrange의 값은 필수, GREEN면 greenApple과 greenOrange의 값에 대한 필수값 체크를 하고 싶었습니다. 우선..
JPA와 Mybatis를 동시에 사용하고 있다. 두 기술의 트랜잭션을 서로 공유하면서 사용하고 있는데 세팅한 방법을 기술한다. 실무에선 2개 이상의 데이터베이스를 한프로젝트에서 사용한다. application.yml에서는 아래와 같이 세팅한다 spring: ${보통 DB이름}: //자유롭게 입력 datasource: type: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: ${DB URL} username: ${DB 계정이름} password: ${DB 계정비밀번호} hikari: poolName: ${poolName} //자유롭게 입력 connectionTimeout: ?? maximumPoolS..
목적 : 컨텐츠 검색시 싱글쿼터( ' )가 포함된 검색어가 있는경우 \를 붙여주기 마이바티스를 사용할수 밖에 없는 쿼리이며 mysql은 자바처럼 싱글쿼터를 \을 붙여줘야 인식하기 때문에 특정 컨트롤러에서 치환해도 되지만 공부할겸 필터에서 가공하는 코드를 작성해봤다. @ServletComponentScan @SpringBootApplication public class TestApplication { public static void main(String[] args) { SpringApplication.run(VodmanagerApplication.class); } } @ServletComponentScan 등록 등록해야 @WebFilter, @WebListener and @WebServlet 주석을 s..
Mockito를 이용한 테스트 코드 작성시 발생한 이슈를 간단히 정리하고자 합니다. @Table(name = "category") @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Category extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "parent_id") private Long parentId; @Builder public Category(String name, Long pare..
회원 정보 수정에서 썸네일 업로드가 필요했습니다. 파일을 Gloud에 저장하여 업로드 및 다운이 필요했기에 현재 사용하고 있는 Google Cloud Platform을 선택하였습니다. 적용하는데 발생한 이슈위주로 적는 글이라, 자세한 설정은 아래 블로그를 참조해주세요. jyami.tistory.com/54 GCP Cloud Storage + Springboot 연동하기 이번 외주를 맡은 내용이 Google Cloud Storage를 이용해서 file을 업로드, 다운로드하는 API 기능을 구현해서 이 내용을 정리하고자 한다. Cloud Storage를 다루는 방법으로 Google Cloud Console, Cloud SDK를.. jyami.tistory.com 설정 gradle 설정을 다음과 같이 했습니다..