일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Linux
- VSCode
- react
- gradle
- JPA
- BPMN
- NCP
- sapfiorielements
- tibero
- springboot
- Spring
- maven
- LOG4J
- database
- Git
- nginx
- Windows
- useEffect
- JavaScript
- Java
- intellijIDEA
- Kubernetes
- docker
- mybatis
- log4j2
- dbeaver
- MySQL
- IntelliJ
- nodejs
- gson
- Today
- Total
목록분류 전체보기 (261)
두 손끝의 창조자
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')) 쓸때는 이런 식이 아닐까?
클래스의 속성이 모두 final 일 때 자동으로 컨스트럭터의 파라미터로 만들어 줘서 편리하게 쓸 수 있다. 하지만 속성 중에 String 등 같은 타입이 여러개 잇을 때 기대한 순서가 달라 실제 사용한 클라이언트에서 사용했을 때 순서와 필드를 추가했을 때 순서가 다를 수 있다. 매우 심각한 문제를 발생시키므로 속성 타입이 모두 다를 때나 가끔 사용하고 아니면 사용하지 말자.
gson을 아무 옵션 없이 쓰면 소수점이 없는 숫자도 모두 float 타입으로 변환한다. Number 타입 변환 전략을 수정하면 Long과 Double 중 하나로 변환하게 할 수 있다. gson = new GsonBuilder() .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) .create();
ObjectMapper objectMapper = new ObjectMapper(); //noinspection deprecation objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 위 코드는 오브젝트를 컨버팅 할 때 타깃과 소스의 이름의 케이스를 무시하고 없는 경우도 오류내지 않고 가능한 것만 매핑하라는 옵션이다.
서버에 쉘 스크립트를 만들어 넣고 스크립트를 실행할 때 유의해야 할 점이 있다. 쉘 스크립트가 실행되는 위치가 쉘 스크립츠 위치와 상관없이 홈 디렉토리이다. 따라서 스크립트에 스크립트의 상대경로로 무언가 파일을 읽거나 쓰도록 했다면 서버에서 직접 실행했을 때는 잘 되지만 hidetake 같은 원격 쉘 실행도구로는 정확하게 실행되지 않는다. 경로에 유의하라
gradle 플러그인 hidetake 로 원격지에 있는 서버에 쉘 명령을 수행할 수 있다. ssh 로 최초 접속을 하면 알 수 업는 서버인데 계속 하겠냐고 물어보고 알았다고 하면 ~/.ssh/known_hosts 파일에 호스트 정보를 기록한다. 그 뒤는 안물어보게 되는데 hidetake로 ssh 명령 스크립트를 만들고 배포를 하고 사용하도록 했는데 해당 사용자는 해당 호스트 접속 이력이 없어 권한이 없다고 뜨거나 ssh 접속을 아얘 한적이 없다면 known_hosts 파일을 찾을 수 없다고 한다. 이럴때 간단하게 known_hosts 에 호스트 정보를 넣어주면 된다. ssh-keyscan -t rsa server.com >> ~/.ssh/known_hosts 윈도우즈에서는 git-scm에서 git을 설치..
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) ~..

구조 Car - Body < Part 구조가 있을 때, 즉 Car 는Body 와 1:1,Body 와 Part 는 1:n 관계가 있다. JPA에서는 모두 양방향 참조로 Car에서 Part 까지 접근 가능하고, 연관관계 주인은 Car -Body 에서는Body 가,Body < Part 에서는Part 가 가지고 있다. 엔티티 저장을 편리하게 하기위해서 모든 OneToXXX 는 cascade 모드를 ALL 로 하였다. 각 엔티티는 Audit 처리를 위해 Audit MappedSuperclass를 상속하고 이 클래스는 int 타입의 version 필드를 가지고 있다. 이 Audit 엔티티에 @EntityListeners 를 등록해서 Create, Update 시 버전을 올릴려고 AuditListener 을 구현하고..