본문 바로가기

Back/Java

(14)
[Java] 서버 실행 환경 조회하기 (베타인지 확인해서 로직 적용) 배경 이메일 알림 발송 기능을 구현하던 중, 테스트 할때는 테스트용 계정에서 메일이 수신되도록 구현하려고 함. 로컬이나 알파에서는 테스트 계정. 베타에서는 실제 담당자한테 메일을 발송. 이슈 실행환경을 확인해서 beta가 아닐때는 (local 또는 alpha 일때) 테스트 계정으로 수신자를 설정. String env = System.getproperty("spring.profiles.active"); if(env.equals("beta")) { // 실제 담당자로 수신인 셋팅 } else { // 테스트계정으로 수신인 셋팅 } 위와 같이 적용했을때 로컬에서는 알파환경으로 실행해도 이슈가 발생하지 않고 메일발송이 정상작동 함. 알파서버를 실제로 올렸을 때 에러로그없이 메일발송이 되지 않고, 500에러 발생..
[JAVA/멀티스레드] JAVA멀티스레딩 - 스레드연결 (join) join 필요 배경만약에 프로그램이 실행되는 과정에서 어떤 계산에 대한 결과값을 받아서 다음 로직을 실행해야 되는 상황이라면.. 어떻게 처리해야할까? 스레드A가 스레드B의 결과값을 참조하려할때 단순히 루프를 돌려서 스레드B의 종료를 확인할 수 있다. 그러나 이 방법은 스레드A의 실행을 방해하여 느리게 하므로 비효율적이다. 예제1. 팩토리얼 계산 스레드 실행팩토리얼 계산을 여러개 한번에 실행하는 경우 각각의 계산은 각각의 스레드로 실행 모든 스레드의 실행이 끝났을때 값을 출력하기를 원함 public static class FactorialTread extends Tread { private long inputNumber; private BigInteger result = BigInteger.ZERO; pr..
[JAVA/멀티스레드] JAVA멀티스레딩 - 스레드종료 및 데몬스레드 퀴즈 퀴즈1 public static void main(String [] args) { Thread thread = new Thread(new WaitingForUserInput()); thread.setName("InputWaitingThread"); thread.start(); } private static class WaitingForUserInput implements Runnable { @Override public void run() { try { while (true) { char input = (char) System.in.read(); if(input == 'q') { return; } } } catch (IOException e) { System.out.println("An exception..
[JAVA/멀티스레드] JAVA멀티스레딩 - 스레드조정 (스레드 종료 및 Demon 스레드) 스레드 조정하나의 스레드를 다른 스레드에서 멈추게하는 작업 스레드를 멈추게 하는 이유 (스레드 조정 이유)와 스레드 조정방법 (멈추는 방법)1. 사용하지 않는 스레드의 리소스 정리스레드는 아무것도 하지 않을때도 리소스를 사용한다.메모리와 일부 커널 리소스를 사용하고, 스레드가 실행중이라면 CPU시간 뿐만 아니라 CPU 캐시공간도 사용한다.그러므로 생성한 스레드가 이미 작업을 완료했는데, 애플리케이션은 작동 중이라면 사용하지 않는 스레드가 사용하는 리소스는 정리해야 한다. 예제스레드 sleep메서드에서는 interruptedException이 발생하면 직접 처리해야 하는게 명확하다 package thread.interrupt; public class Main { public static void main(..
[JAVA/멀티스레드] JAVA멀티스레딩 - 스레드생성2부. 스레드 상속 (도둑과 경찰 예제) 스레드 생성방법 두번째 스레드에 대한 개별적인 객체와 Runnable의 또다른 객체를 만드는 대신 (스레드생성1부에서 했던 방법), 스레드를 확장하는 새 클래스를 만든다. Thread 클래스를 열어서 확인해보면 Runnable인터페이스가 구현된 것임을 알수 있다. 현재 스레드와 직접적으로 관련된 많은 데이터와 메서드에 엑세스 할 수 있어요 package thread.creation.example; public class Main { public static void main(String[] args) { Thread thread = new NewThread(); thread.start(); } public static class NewThread extends Thread{ @Override public..
[JAVA/멀티스레드] JAVA멀티스레딩 - 스레드생성1부. 스레드의 기능과 디버깅 스레드 생성자바에서는 JDK가 모든 스레드의 관련 속성과 메서드를 스레드 클래스로 압축한다. 그래서 새 스레드를 만들려면 스레드 객체를 생성해야한다. package thread.creation.example; public class Main { public static void main(String[] args) { Thread thread1 = new Thread(new Runnable() { @Override public void run() { //Code that will run in a new thread } }); //lambda java8 Thread thread2 = new Thread(()->{ //스레드명을 알 수 있는 static 메서드 Thread.currentThread().getN..
[JAVA/멀티스레드] JAVA멀티스레딩 - 운영체제기초2 (컨텍스트 스위치) Context Switch (컨텍스트 스위치) - OS가 알아서 스레드 관리를 해주는데, 여러개의 스레드가 번갈아 가면서 CPU를 사용할수 있게 한다. 이때, 하나의 스레드에서 다른 스레드로 전환하는 일을을 ‘컨텍스트 스위치’라고 한다. 컨텍스트 스위치가 발생할때는 리소스를 CPU와 메모리에 복원하는 일을 한다.(사람이 여러가지 일을 한번에 할때 다른일을 하기위해 잠시 머리를 정리하고 준비를 하는것과 비슷) - 너무 많은 프로세스와 스레드가 실행중일때는 컨텍스트 스위치가 너무 자주 일어나기 때문에 성능저하가 있을 수 있다. (context switch cost 발생) - 같은 프로세스 내 두 스레드간의 컨텍스트 스위치를 할때는 서로 리소스를 공유하기 때문에 다른 프로세스의 스레드간 컨텍스트 스위치보다 효..
[JAVA/멀티스레드] JAVA멀티스레딩 - 개요와 운영체제기초 멀티스레드 공부 시작 Udemy 강좌로 시작~~~ 멀티스레드 필요이유1. 응답성 향상 (빠른 반응)특히 유저인터페이스가 있는 프로그램의 경우. 사용자가 어떤 요청을 해서 실행시간이 길어지면 다음요청에 대해서는 이전요청의 실행이 끝날때까지 기다려야함. 동시에 여러작업을 병행하기위해 멀티스레드가 필요. 2. 성능병행성(동시성)으로 여러작업을 동시에 수행하는 것처럼 보인다 싱글코어, 하나의 코어만으로도 같은 시간안에 더 많은일을 할수 있다. 스레드는 무엇???시스템의 기본적인 작동 방식- 컴퓨터를 켜면 ‘운영체제’라는 특별한 프로그램이 디스크에서 메모리로 로드됨 - 운영체제는 애플리케이션 개발자(나)를 대신해 간섭하고 나와 하드웨어 사이의 상호작용을 돕는다 - 모든 애플리케이션(메모장,웹브라우저 등)은 파일형..