React 에서 useState 은 훅(Hook) 에 하나다. 함수 컴포넌트에 상태를 추가하기 위한 훅이다. useState 키 포인트 또 다른 키 포인트는 useState 가 배열로 값을 리턴한다. 여러 예제 여러 상태 값 복잡한 상태 업데이트 배열을 상태로 가지는 예제 팁(Tip)
Spring boot 에 systemd 유닛 만들기
요즘 프로젝트를 하고 있는데, 역시나 자바 시스템이 있다. Spring Boot3 을 사용하고 있고 자바 17을 쓰는등 나름대로 괜찮은 환경에서 개발이 이루어지고 있다. 그런데, 이것을 서버에서 배포를 하고 Spring Boot 를 실행해야 하는데, 어떻게 하나 봤더니 초보자 수준도 못 벗어나는 설정을 하고 있으니… 안타까운 마음에 어떻게 하는 것이 좋은 것인지 한번 적어봤다. Spring boot, jar 실행 파일 Spring Boot3 를 컴파일 하면 jar 파일 나온다. 그리고 별다른 서버 없이도 바로 실행하고 접속이 가능해 진다. 한가지 재미있는 사실은 많은 사람들이 Spring boot3 […]
REST 역사
현대의 소프트웨어 아키텍쳐로 인기가 있는, 아니 어쩌면 전부일 수도 있는 REST 에 대한 역사는 2000년으로 거슬러 올라간다. 시기적으로 그 당시에 한국에서는 IT 버블이라는 현상도 있었던 만큼 IT 관련 기업들이 많이 생겨나고 했던 때다. 2000년 당시를 회상해보면 웹 메일(Web Mail) 서비스를 기반으로 하는 포털들이 많이 있었다. 해외에서는 야후(Yahoo) 가 대표적이였고 마이크로소프트(Microsoft) 의 경우에도 Hotmail 과 함께 MSN 포털을 운영했었다. 국내에서는 다음(Daum) 이 한메일(Hanmail) 서비스를, 네이버(Naver)가 네이버 메일을 기반으로 포털로서 성장하던 때다. 아,,, 네이트도 있었는데, 당시 네이트는 네이트온(NateOn) 메신저가 인기가 있었던 것으로 […]
Collection Sort Lamba in Java
Java 8 이전에서 객체나 Map 같은 것을 정렬하기 위해서는 Collections 을 사용해야만 했다. 예를들어 다음과 같은 소스다. 하지만 Java 8 에 도임된 람다(Lambda) 를 사용할 경우에 이를 간단하게 해결할 수 있다. 더 나가 람다는 타입을 정의하지 않아도 된다. 컴파일러가 타입을 추론(Inferring) 하게 된다. 따라서 다음과 같이 간단하게 쓸 수 있다.
G1 Collector 기본 설정
G1 GC 의 기본적인 목표는 짧은 STW 시간을 가지고 가는 것이다. 어짜피 STW 를 피하지 못할 바에야 이 시간을 짧게 가지고 가는게 유리하다. 여기서 구분해야할는게 있는데 STW 는 Young GC 일때도 발생한다. 하지만 그 시간이 매우 짧아서 못 느낄 정도일 뿐이다. Old GC 의 경우에는 Young GC 대비 STW 시간이 매우 길다. 그 이유는 Heap 메모리 전체를 청소해야하기 때문이며 청소해야할 공간이 클 수록 Garbage Collector 작동을 위한 자원 소모가 많아진다. 다음과 같은 목표를 갖는다. 여기서 주목해야하는 것이 Full GC 발생하지 […]
Spring Boot, error: constructor … in class .. cannot be applied to given types 오류
Spring Boot 로 프로그램을 작성하고 난 후에 Compile 단계에서 다음과 같은 오류를 만날 수 있다.
1 2 3 4 5 6 |
EmployeeServiceImpl.java:13: error: constructor Employee in class Employee cannot be applied to given types; return Mono.just(new Employee(empId, "emp1", "manager", 3000)); ^ required: no arguments found: Long,String,String,int reason: actual and formal argument lists differ in length |
에러 코드를 보면 new 연산자를 이용해 Employee 객체를 생성하는 부분인데, 이부분이 문제가 된다는 것이다. required: no arguments 라고 나오지만 Employee 는 다음과 같이 되어 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package local.systemv.springboot.test.apps.model; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @AllArgsConstructor @Getter @Setter public class Employee { private Long empId; private String name; private String description; private double salary; } |
@AllArgsConstructor 어노테이션을 줘서 자동으로 모든 객첵 멤버변수를 인자로 받는 컨스트럭터를 생성하도록 하고 했다. 이것은 Lombok 을 이용한 것으로 다음과 같이 gradle 에서 의존성을 줬다.
1 |
compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.16' |
문제는 Eclipse 나 IDE 툴에서는 SpringBoot 애플리케이션이 잘만 실행되지만 정작 컴파일을 할려고 하면 […]
JEE 7, JEE 8 and Jakarta EE 8
Java EE 7 Specification Java EE 8 Specification Jakarta EE 8 Specification The Jakarta EE 8 has the same set of specifications from Java EE 8 with no changes in its features. The only change is the new process to evolve these specifications. With this, Jakarta EE 8 is a milestone in Java enterprise history, as it inserts these specifications in a new process to boost the specifications to a cloud-native application approach. Jakarta EE 8: The new era of […]
Spring5 Security 기초 템플릿 – Session
이 글은 Spring5 에 Spring-Security 에 대한 기초 템플릿이다. Session 유지를 위해서 Redis 를 필요로 한다. 또, ElasticSearch 의 RestHighLevelClient 로 ElasticSearch를 연결 한다. 데이터베이스는 JNDI 설정으로 연결 된다. 다음과 같은 내용을 담았다. JDK 11 Tomcat 서버 9 를 이용. spring-session.xml 을 작성해 Redis 를 세션으로 사용하도록 했다. JNDI 를 이용해 MySQL 에 연결된다. Redis 설정한 이유는 Spring Security 에 인증을 InMemory 를 요구 한다. 이는 다음과 같은 설정 때문이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<authentication-manager> <authentication-provider> <user-service> <!-- This is required a InMemory DB. So I setup Redis and config to a spring-session.xml for connecting the redis if you set spring-session.xml, you should config also web.xml for springSessionRepositoryFilter --> <user name="jimi" password="{bcrypt}$2a$10$ddEWZUl8aU0GdZPPpy7wbu82dvEw/pBpbRvDQRqA41y6mK1CoH00m" authorities="ROLE_USER, ROLE_ADMIN" /> <user name="bob" password="{bcrypt}$2a$10$/elFpMBnAYYig6KRR5bvOOYeZr1ie1hSogJryg9qDlhza4oCw1Qka" authorities="ROLE_USER" /> <!-- Password is prefixed with {noop} to indicate to DelegatingPasswordEncoder that NoOpPasswordEncoder should be used. This is not safe for production, but makes reading in samples easier. Normally passwords should be hashed using BCrypt --> <!-- <user name="jimi" password="{noop}jimispassword" authorities="ROLE_USER, ROLE_ADMIN" /> --> <!-- <user name="bob" password="{noop}bobspassword" authorities="ROLE_USER" /> --> </user-service> </authentication-provider> </authentication-manager> |
인증을 위한 패스워드가 {bcrypt} 로 되어 있다. 이 설정은 […]
Spring5 Security 기초 템플릿
이 문서는 Spring5 Security 기초 템플릿에 대한 것이다. Spring5 에 Spring-Security 를 이용해 기초적인 로그인을 구현 했다. Session 은 InMemory 가 아닌 WAS 서버에 세션을 저장한다. 로그인 정보는 spring-security.xml 에 정의된 것을 그대로 사용했다. 그야말로 기초적인 내용만 담았다. 이 템플릿이 동작하기 위한 조건은 다음과 같다. Java 1.8 기반. 데이터베이스가 연결되어 있어야 한다. 데이터베이스는 MySQL 이다. WAS 서버에 JNDI 를 연결된다. users 테이블이 필요한데, user.sql 파일에 내용이 있다. spring security 의 Role 기반 권한 접근 제어. context root 는 malluser 이다. […]
Mybatis에 DAO 와 Mapper
SpringFramework 을 이용하다보면 데이터베이스 액세스를 위해서 MyBatis 를 사용하곤 한다. SQL 매퍼라고 불리기도 하는 것인데, 이를 이용하면 손쉽게 자바 코드와 SQL 문을 분리해줄 수 있을뿐만 아니라 MyBatis 에서 제공하는 여러가지 추가적인 기능을 이용해 데이터베이스를 좀 더 유연하게 사용할 수 있다. DAO 보통 MyBatis 를 이용할대는 DAO 를 구조를 사용하곤 했다. Data Access Object 라고 불리는 것으로 말 그대로 데이터 접근을 위한 객체로서 sqlSession 객체를 이용해 데이터베이스 조회만 전담하는 객체다. 이 구조는 인터페이스와 그것을 구현한 구현체 클래스가 있어야 한다. 이를 위해서 […]