일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- NCP
- JPA
- IntelliJ
- intellijIDEA
- JavaScript
- gradle
- react
- kubectl
- dbeaver
- Git
- mybatis
- docker
- MySQL
- tibero
- VSCode
- nginx
- log4j2
- Windows
- Spring
- wildfly
- useEffect
- springboot
- BPMN
- gson
- database
- LOG4J
- Java
- Kubernetes
- nodejs
- jetbrains
- Today
- Total
목록Spring (35)
두 손끝의 창조자
public DataSourceInitializer tenantIndependentInitializer() {ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();resourceDatabasePopulator.addScript(new ClassPathResource("schema.sql"));DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();dataSourceInitializer.setDataSource(tenantIndependentDataSource());dataSourceInitializer.setDatabasePopu..
스프링부트로 프로젝트 수행 도중 타입 체크 (isAssignableFrom) 부분에서 문제가 발생했다. 특정 클래스의 오브젝트를 인자로 리플렉션으로 메소드를 실행하려고 하는데 메소드의 파라미터 타입과 클래스의 오브젝트 타입이 달라서 실행이 안되는 문제가 발생했다. 디버깅 해본 결과 분명 타입은 같은 타입이었다. 허나 다른 부분은 클래스로더였다. 하나는 RestartClassLoader 다른 하나는 AppclassLoader 였다. 클래스 로더가 다르면 둘의 타입은 다르다고 인식할 수 있기 때문에 가장 의심스러운 부분이었다. RestartClassLoader는 스프링부트의 spring-boot-devtools 를 사용하면 추가되는 클래스로더이다. spring-boot-devtools를 제거하고 나니 잘 수..
Spring Boot 애플리케이션에서 로그 레벨을 동적으로 설정하는 방법에 대해 살펴본다. Spring Boot Actuator 소개 Spring Boot Actuator는 Spring Boot의 하위 프로젝트로서 애플리케이션의 관리와 모니터링에 필요한 다양한 기능을 제공한다. 이를 통해 애플리케이션의 상태, 메트릭스, 그리고 여기서 다룰 내용인 로깅과 같은 중요한 정보를 제공한다. 로그 레벨 확인하기 로그 레벨을 확인하려면 /actuator/loggers 엔드포인트로 GET 요청을 보내면 된다. curl -X GET http://localhost:8080/actuator/loggers 응답 형태 { "levels": ["TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FAT..
프로젝트에 루트에서 다음과 같은 파일을 찾아서 초기화 시 실행한다. schema.sql data.sql schema-${platform}.sql data-${platform}.sql ${platform} 은 spring.datasource.platform 의 값을 사용한다. spring.datasource.initialization-mode 속성을 always 로 설정한다. JPA를 사용한다면 spring.jpa.hibernate.ddl-auto 속성을 none으로 해야 테이블 자동 생성등을 비활성한다. 이런 방법은 sql이 DATABASE에 따라 변경이 필요할 수 있다. @PostConstruct 애노테이션으로 메소드를 지정하면 스프링 컨텍스트가 모두 로드 된 후 해당 메소드를 실행하기 때문에 데이터 ..
spring boot 를 사용하면 application.properties 에 속성을 설정하여 @Value 애노테이션으로 참고하여 사용할 수 있다. 인텔리제이 유료버전에서는 속성값 검증이 어느정도 되는데 프로퍼티 작성시에 자동 완성 기능이 동작하지는 않는다. 속성에 대한 구조, 항목을 클래스로 정의하고 appication.properies 에 정의할 때 자동 완성 기능을 할 수 있도록 해보자. spring-boot-configuration-processor 추가 annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor' 프로퍼티 클래스 정의 @ConfigurationProperties(prefix = ..
기본값으로 포함되어 있는 logging 모듈을 제외시킨다. configurations { configureEach { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' } } log4j2 SpringBootStart를 의존성에 추가한다. implementation 'org.springframework.boot:spring-boot-starter-log4j2'
특정 컨텍스트에서 새 오브젝트로 데이터를 바인드 시키려면 ObjectMapper 같은 라이브러리를 활용하면 편리하다. 스프링 부트에는 이 기능을 제공하는데 org.springframework.boot.context.properties.bind.Binder 클래스가 그 역할을 수행한다.
[Spring Boot]war로 배포하기 (Gradle + 내/외장 톰캣) (tistory.com)
RestController 에서 일반 오브젝트를 반환하면 스프링이 json으로 변환하여 응답한다. 이 과정에서 오브젝트를 json으로 변환할 수 없어 예외가 발생할 수 있다. 변환 못 하는 경우는 특정 오브젝트의 컨버터가 없어서 발생할 수 있는데 getter가 존재하기면 하면 어기간한것들은 다 해줄 수 있다. 그런데 getter가 아얘 없는 클래스의 오브젝트를 반환하려고 하면 예외가 발생한다. 당연하게도 아무것도 없으니. 반환하는것 자체가 문제가 있다. 그런데 정황상 어쩔수 없는 경우 그냥 반환하게 해야할 수도 있는데 빈 오브젝트인 경우 json 생성시 무시하게 옵션을 주면 된다. spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=falseRestController에..
프로파일 별로 다른 DB접속 정보를 사용하기 위해서 아래와 같이 설정하였다. 스프링 부트에 property 파일을 이용해서 설정하던디 -D를 이용해서 환경설정으로 실행했을 때는 문제없이 수행된다. @Configuration @PropertySources({ @PropertySource("classpath:/properties/${spring.profiles.active:local}.properties"), @PropertySource("classpath:/properties/db/biz/${spring.profiles.active:local}.properties"), @PropertySource("classpath:/properties/db/frm/${spring.profiles.active:local}..
SpringTest로 테스트 실행 전 Sql을 실행하려면 클래스나 메소드에 @Sql 애노테이션으로 미리 작성된 쿼리를 실행할 수 있다. 만약, 실행했는데 java.lang.IllegalStateException: Failed to execute SQL scripts for test context ---- 생략 at org.springframework.util.Assert.state(Assert.java:97) ~[spring-core-5.3.13.jar:5.3.13] at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.executeSqlScripts(SqlScriptsTestExecutionListener.java:254) ~..
소스 코드 domain project 소스코드 package cothe.service; import cothe.entity.Yo; import javax.transaction.Transactional; public class YoService { private final YoRepository yoRepository; public YoService(YoRepository yoRepository) { this.yoRepository = yoRepository; } @Transactional public void updateName(Long id, String name) { Yo yo = yoRepository.findById(id).get(); yo.updateName(name); } @Transactio..
application.properties에 logging.level.org.apache.coyote.http11=debug 꼭 스프링부트가 아니어도 로거에 org.apache.coyote.http11 를 debug로 출력하게 하면 요청정보가 출력될 것임(톰켓을 썼을 때)
Controller를 기본 대상에서 포함시키고, 기본 필터를 끈다. @ComponentScan(basePackages = {"com.dongkuk.dmes.cr"}, includeFilters = @ComponentScan.Filter( type = FilterType.ANNOTATION, classes = {Controller.class} ), useDefaultFilters = false)
RequestParam으로 복수 개로 넘어온 파일을 바인딩 시킬 수 있는데 복수개로 지정하면 RequestParam의 값을 지정해야한다. 즉 멀티파트로 폼 전송을 할 때 같은 이름으로하고 파일명을 다르게 해야한다. @RequestMapping("/upload") String fileUpload(@RequestParam("imageFiles") List files) { }
class DummyTransactionManager implements PlatformTransactionManager { SimpleTransactionStatus transactionStatus = new SimpleTransactionStatus(true); @Override public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException { if (transactionStatus.isCompleted()) { transactionStatus = new SimpleTransactionStatus(true); } return transactionStatus; } @Override p..
EntityManagerFactory 는 persistence.xml 에 정의한 persistence unit 당 하나를 만든다. 팩토리는 애플리캐이션 레벨에 하나만 존재하면 되고 이 팩토리를 이용해서 EntityManager를 만들어서 데이터 처리를 하면된다. 스프링에는 트랜잭션을 ThreadLocal 을 이용해서 관리하고 있는데 한번 만들어진 EntityManager를 같은 스레드 내에서 가져오고 싶을 때 편리한 유틸리티 클래스를 제공한다. EntityManagerFactoryUtils 이 그것이다. getTransactionalEntityManager 메소드에 EntityManagerFactory를 파라미터로 전달해서 현재 스레드에서 동작중인 EntityManager 를 가져온다. 여러 클래스와 메..
junit5 부터는 RunWith 대신 ExtensionWith 애너테이션을 사용하여 스프링과 상호작용한다. 그러기 위해서는 SpringExtention 클래스가 필요한데 이건 스프링 5부터 지원한다. spring 4 에서 사용하기 위해서는 아래 라이브러리를 추가한다. 먼저 리포지포리를 추가하고 repositories { mavenLocal() mavenCentral() maven { url "https://jitpack.io" } } testImplementation('com.github.sbrannen:spring-test-junit5:1.5.0') 테스트 의존성을 추가한다.
EmbeddedDatabase는 테스트 할 때 유용하게 쓸 수 있다. 나는 이것을 내가 만든 코드가 트랜잭션이 잘 동작하는지 확인하고자 할 때 사용했다. EmbeddedDatabase 는 자체로 DataSource 이어서 스프링의 트랜잭션 매니저나 JdbcTemplete 에 바로 사용할 수 있다. 하지만 트랜잭션테스트를 하기 위해서는 그대로 사용하면 build 할 때마다 다른 데이터베이스가 생겨 스키마를 공유할 수가 없게된다. 그래서 EmbeddedDatabase 는 진짜 디비만 생성하고 데이터 소스는 이를 참고하여 만든뒤 그 것을 활용하는것이 좋겠다. EmbeddedDatabase database = new EmbeddedDatabaseBuilder() .generateUniqueName(true) ...
3.4 버전부터는 자동으로 매핑을 사용할 수 있다. 그 전버전은 타입핸드러를 직접 구현하여 사용해야한다. 구현하는 방법은 다른 사이트 참조. 단, 3.4.4 이하는 mybatis-typehandlers-jsr310 의존성을 추가해줘야 한다. 3.4.5 버전 이후는 포함되어 있다. mybatis.org/mybatis-3/ko/configuration.html#typeHandlers MyBatis – 마이바티스 3 | 매퍼 설정 매퍼 설정 마이바티스 XML 설정파일은 다양한 설정과 프로퍼티를 가진다. 문서의 구조는 다음과 같다.: configuration properties 이 설정은 외부에 옮길 수 있다. 자바 프로퍼티 파일 인스턴스에 설정할 mybatis.org github.com/mybatis/myba..