일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- jetbrains
- BPMN
- Windows
- JavaScript
- docker
- Git
- database
- NCP
- intellijIDEA
- gson
- gradle
- dbeaver
- LOG4J
- MySQL
- Kubernetes
- react
- kubectl
- mybatis
- tibero
- Java
- wildfly
- nginx
- springboot
- JPA
- useEffect
- VSCode
- IntelliJ
- Spring
- nodejs
- log4j2
- Today
- Total
목록분류 전체보기 (247)
두 손끝의 창조자
select * from table명 으로 조회해서 그리드에서 직접 데이터 변경하고 싶은데 Column is read-only: No corresponding table column. 뜨면서 안되고 잠겼다고 뜰 때 조회할 때 스키마를 붙여서 조회해볼 것. select * from 스키마명.테이블명
SMTP 서버 설정정보로 세션을 흭득하고 MimeMessage에 세션을 가지고 메시지를 만들고 Transport 로 메시지를 전송한다. 세션을 만들때 default세션으로 가져오면 다른 계정에 대한 정보를 인지하지 않고 기본세션정보만 가져오기 때문에 유의해야한다. import org.springframework.util.StringUtils; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Propertie..
ctrl+f 를 눌러서 찾기/바꾸기 창을 연 뒤에 정규식 옵션을 체크하고 찾기에 #\{(\w+)\}바꾸기에 :$1를 넣는다. 그 반대는 :(\w+)#{$1}이다.
스프링부트 등 jar 로 말려있는 자원 내부에서 특정 리소스를 참조할 때 로컬에서 테스트할 때는 잘되나 서버에서 실행하면 오류가 발생할 수 있다. 리소스에서 읽을 때 File을 받아오지말고 스트림으로 받아 와서 처리. 왜 그런지는 확인 필요. Spring Boot에서 src/main/resource 파일 접근 방법 및 주의사항. — wedul
메인 모듈에 mapper 가 있는데 테스트 모듈에서 매퍼 파일을 못 읽어서 Mapped Statements collection does not contain value for 와 같은 예외가 발생할 수 있다. 대부분의 경우 id를 잘 못 넣은 케이스지만 매퍼 파일 자체를 해당 모듈에서만 읽어서 발생하는 문제일 수 있다. String MYBATIS_MAPPER = "classpath*:/mappers/**/*.xml"; 매퍼 경로를 위와같이 변경하고 시도해보자.
프로젝트에서 여러가지 DataAccess 기술을 쓰고 있는데 한 트랜잭션에서 다양한 기술을 사용할 때는 유의 할 점이 있다. JPA에서 데이터를 저장하고 난 뒤 flush를 해야 다른 기술에서 그 데이터를 확인 할 수 있다. mybatis도 유사한 기능이 있는데 캐시를 가지고 있어서 flush를 해줘야한다. 이 캐시 자체의 범위를 조정하거나 쓰는 옵션이 있는데 링크를 참조. [오픈소스] MyBatis 내장 cache에 대해서 (tistory.com)
MappedStatement mappedStatement = sqlSession.getConfiguration().getMappedStatement(s); List resultMaps = mappedStatement.getResultMaps(); ResultMap resultMap = resultMaps.get(0); Class type = resultMap.getType();
EntityManagerFactory는 DataSource와 연관되어 있다. 스프링 환경에서 사용하는 경우 EntityManagerFactory는 빈으로 등록해서 사용하는게 효율적이라 등록 후 사용중이라면 ApplicationContext에서 Factory를 가져올 수 있다. @Transactional 로 트랜잭션 관리를 한다면 @PersistentContext 애노테이션으로 쉽게 현재 스레드의 EntityManager를 가져올 수 있다. @PersistentContext EntityMager em; 그러나 트랜젝션을 직접 관리한다면 아래 방법으로 가져올 수 있다. EntityManager em = EntityManagerFactoryUtils.getTransactionalEntityManager(emf);
git config --global pull.ff only 리모트에 자신 커밋 보다 상위에 다른 뭔가가 있으면 merge 할 때 오류가 뜬다.
java 11.0.15 이상에서 undertow로 웹 서버를 올리면 제대로 동작을 안한다. java 17버전으로 해도 마찬가지 이다. spring boot 에서 undertow로 변경하면 안되고 톰켓은 또 잘 된다. Java regression and Undertow - Communities / CommandBox CLI - Ortus Solutions Community
mockito로 mock을 만들면 해당 메소드의 파라미터 이름을 지운다. 그래서 리플렉션으로 메소드 파라미터의 이름을 사용해야 할 경우 사용할 수 없으므로 유의할 것.
String date = "20220615052111"; LocalDateTime parse = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); System.out.println(parse); Instant instant = parse.atZone(ZoneId.systemDefault()).toInstant(); System.out.println(instant); System.out.println(LocalDateTime.ofInstant(instant, ZoneId.systemDefault())); System.out.println(ZoneId.systemDefault());
Spring data에서 Persistable 인터페이스는 ID를 가져오는 getId, 새로운 오브젝트여서 저장해야 하는지 merge 해야하는지 판단 할 수 있는 isNew 메소드가 있다. 엔티티에서 @Id 애노테이션으로 지정하면 엔티티를 만들 때 이미 ID가 null이 아니기 떄문에 새로운 객체가 아니라고 판단해서 select 한뒤 다시 머지를 하는 비효율적인 행동을 한다. 그래서 ID를 개발자가 직접 넣어줘야하는 엔터티는 Persistable 인터페이스를 구현해서 어떤 상황이 새로운 객체인지 알게 해 주어야한다.
JPA에서 Entity를 가져와서 필드 하나를 업데이트하고 난뒤 커밋할 때 실제로 수행되는 쿼리를 확인해보면 전체 필드에 대해서 다시 업데이트되는 것을 볼 수 있다. 성능상 효율적일 수는 모르겠으나 유지보수할 때는 쿼리가 실행된 타이밍에 어떤 필드가 업데이트 됐는지 알 수가 없어 고통이 따를 수 있다. @Entity 과 함께 @DynamicUpdate 애노테이션은 이 부분을 해결한다. 음~ 깔끔해진 쿼리.
gradle 프로젝트면 resources 디렉토리에 import.sql 파일을 넣으면 초기화 할 때 자동으로 호출된다. 그런데 무슨 데이터소스 기준으로 하는지 프로파일 별로 할 수는 없는지...
%TB_HOME%\config 디렉토리에 tibero.tip 파일을 연다. MAX_SESSION_COUNT=20 항목을 수정하고 db를 재시작 한다.
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}..
타입이 없으면 다음과 같은 문제가 발생할 수 있음 잘못된 파라미터 함수에 전달 원하지 않은 타입 변환 코드 계층 구조 이해 불가 AddUserToGroup(string, string) 위 메소드는 파라미터가 2개 있다. 하나는 유저일 것이고 하나는 그룹일 것인데 어느 것이 유저이고 어느 것이 그룹인가? 메소드 시그니처 가지고는 알수가 없다. 만약, 타입 파라미터를 아래처럼 정의했다면 AddUserToGroup(User,Group) 순서를 생각할 필요가 없다. AddUserToGroup(new User('u1'), new Group('g1')) 쓸때는 이런 식이 아닐까?