구분
지시어
기본값
 
WEB
HTTP
Timeout
300
비활성화된 연결에 대하여 얼마나 오랫동안 HTTP 연결을 유지하고 있을지를 설정
KeepAliveTimeout
15
아파치 프로세스 (또는 쓰레드) 가 클라이언트가 또다른 HTTP 요청을 보내기 전까지 대기해야 하는 시간을 설정
mod-jk
socket_timeout
0
mod-jkdhk was간 통신채널에서 사용하는 타임아웃, 정해진 시간동안 응답이 없으면 에러를 발생, 0으로 세팅하면 무제한 대기
socket_connect_timeout
socket_timeout*1000
socket_timeout과 같지만 milliseconds 단위로 타임아웃을 설정할 수 있다
socket_keepalive
FALSE
웹서버와 WAS 사이에 방화벽이 있는 경우 사용된다. 이 플래그는 운영체제에 비활성화된 커넥션에 대해서 KEEP_ALIVE메세지를 보냄으로써 방화벽이 비활성화된 커넥션을 끊는 것을 방지한다.
ping_timeout
10000
Millisecond 단위의 타임아웃값. Cping 커넥션확인의 응답인 CPong 을 기다릴 때 사용된다
reply_timeout
0
WEB에서 WAS가 처리되어 응답이 올때까지 대기시간
connection_pool_timeout
0
mod-jk가 커넥션을 닫기 전에 몇초 동안 Cache의 Inactive소켓을 유지할지 결정하기 위하여 Cache timeout 프로퍼티가 connection_pool_minsize와 같이 사용된다
WAS
HTTP/AJP
connectionTimeout
0
요청이 처리 될 때까지 커넥션을 유지하는 시간으로, 기본은 무제한
keepAliveTimeout
-
WAS에서 새로운 요청을 받기 전까지 대기하는 시간, 기본은 connectionTimeout 값을 따라감
session timeout
30분
요청이 들어온 후 새로운 요청이 들어올때까지의 대기시간, 그시간안에 다시 요청이 오면 해당 값은 갱신됨
DB
querytimeout
0
JDBC 쿼리 타임아웃, 기본값음 제한없음
loginTimeout
dbms별 확인필요
DBMS와 새로운 연결을 생성시 해당 DBMS에 Login 하고 Connection 을 획득할때까지 대기 시간
blocking timeout millis
30000
Millisecond 단위로 커넥션을 가져올 때까지 대기할 수 있는 최대 시간지정
idle timeout minutes
30분
풀에 있는 커넥션 중 사용하지 않는 커넥션에 대해 주기적으로 삭제, 해당 시간동안 사용하지 않은 커넥션을 삭제하며 검사주기는 지정값/2
set tx query timeout
FALSE
트랜잭션 타임아웃이 발생하기까지 남아있는 시간을 기준으로 쿼리 타임 아웃을 설정할 것인지를 설정
allocation retry
0
커넥션을 가져올 때 예외가 발생할 때 재시도 횟수를 지정
allocation retry wait millis
5000
연결 할당까지 대기하는 시간

아주아주 간단하게, Spring 에 로그인을 위한 JWT 토큰 발급 방법.

 

1. pom.xml에 jjwt dependency 등록

<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt</artifactId>
  <version>0.9.0</version>
</dependency>
 

2. servlet-context 에 (혹은 본인 프로젝트의 설정 xml 파일에) 설정 작성.

<beans:bean id="jwtInterceptor" class="인터셉터 만들 곳 경로"></beans:bean>
	
	<mvc:interceptors> 
		<mvc:interceptor> 
			<mvc:mapping path="/**"/>
			<mvc:exclude-mapping path="/api/Users/**"/> 
			<beans:ref bean="jwtInterceptor"/> 
		</mvc:interceptor> 
	</mvc:interceptors>
 

mvc:mapping path : 기본적으로 jwt 인터셉터 적용할 api path 설정.

mvc:exclude-mapping path : jwt 인터셉터 적용 제외할 api path 설정.

 

3. Interceptor 클래스 생성

@Component
public class JwtInterceptor implements HandlerInterceptor{
	
	private static final String HEADER_AUTH = "Authorization";
	
	@Autowired
	private IJwtService jwtService;
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		final String token = request.getHeader(HEADER_AUTH);

		if(token != null && jwtService.isUsable(token)){
			return true;
		}else{
			System.out.println(request.getContextPath());
			response.sendError(401,"Authorized Error!!");
			return false;
		}
	}
}
 

preHandle -> HandlerInterceptor implements -> preHandle 상속 받아서 구현.

* preHandle 는 호출 시, 맨 처음 가져가서 컨트롤 하는 부분

 

4. JwtService 구현

@Service("jwtService")
public class JwtServiceImpl implements IJwtService{
	
	private static final String SALT =  "sunkakaocode";
	
	@Override
	public <T> String createToken(String key, T data, String subject){
		String jwt = Jwts.builder()
						 .setHeaderParam("typ", "JWT")
						 .setHeaderParam("regDate", System.currentTimeMillis())
						 .setSubject(subject)
						 .claim(key, data)
						 .signWith(SignatureAlgorithm.HS256, this.generateKey())
						 .compact();
		return jwt;
	}	

	private byte[] generateKey(){
		byte[] key = null;
		try {
			key = SALT.getBytes("UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		return key;
	}
	
	@Override
	public boolean isUsable(String jwt) {
		boolean isUsable = false;
		try{
			Jws<Claims> claims = Jwts.parser()
					  .setSigningKey(this.generateKey())
					  .parseClaimsJws(jwt);
			isUsable = true;
		}catch (Exception e) {
			e.printStackTrace();
		}
		
		return isUsable;
	}
}
 

5. WebConfig 작성

@Configuration
public class WebConfig implements WebMvcConfigurer{

	private static final String[] EXCLUDE_PATHS = {
	};

	@Autowired
	private JwtInterceptor jwtInterceptor;

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(jwtInterceptor).addPathPatterns("/**").excludePathPatterns(EXCLUDE_PATHS);
	}

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
        		.allowedMethods("GET", "POST", "PUT", "DELETE");
    }
}
 

 

실제 사용은 로그인 시 createToken 생성해서 key를 api 의 response에 담아서 전달 / 혹은 Postman으로 호출 시 header 에 값 담아서 호출.

 

 

 

call by ref -> 메모리에 저장되어 있는 '주소' 복사 > 메모리 안의 내용이 변경됨

call by value -> 메모리에 저장되어 있는 '값' 복사 > 메모리 안의 내용 변경 안됨

 

public class Solution {

	private String value;

	Solution(String value) {
		this.value = value;
	}
	
	public static void main(String[] args) {
		String a = "test1";
		String b = "test2";
		
		System.out.println("전  " + a + "  |  " + b);
		
		solutionA(a,b);
		
		System.out.println("후  " + a + "  |  " + b);
		
		
		Solution c = new Solution("test1");
		Solution d = new Solution("test2");
		
		System.out.println("전  " + c.value + "  |  " + d.value);
		
		solutionB(c,d);
		
		System.out.println("후  " + c.value + "  |  " + d.value);
		
	
	}
	
	public static void solutionA(String a, String b) {
		String temp = a;
		a = b;
		b = temp;
	}
	
	public static void solutionB(Solution a, Solution b) {
		String temp = a.value;
		a.value = b.value;
		b.value = temp;
	}

}
 

solutionA / solutionB의 결과가 다른데 그 이유는 solutionA 메서드 호출 시에 사용한 인자 a, b와 solutionA() 메서드내의 매개변수 a, b 는 서로 다르기 때문. 위의 소스를 실행 해 보면 아래와 같은 결과가 나온다.

 

전  test1  |  test2
후  test1  |  test2
전  test1  |  test2
후  test2  |  test1

 

 

'프로그래밍 > Java' 카테고리의 다른 글

Spring - JWT 연동  (0) 2022.05.05
Mutable Object / Immutable Object(부제. String vs Stringbuffer/StringBuilder )  (0) 2022.05.05
접근제어자 정리  (0) 2022.05.05
Java 특징 및 장점  (0) 2022.05.05
JAVA encoding 예제  (0) 2022.05.05

+ Recent posts