분류 전체보기

반응형

오늘은 새로고침시 GET 파라미터 제거하는 법에 대해 알아보겠습니다.

 

GET Parameter(파라미터)란?

 

[Spring] GET과 POST의 차이점과 문법 정리

GET과 POST는 HTTP프로토콜을 이용해서 서버에 무언가를 전달할 때 사용하는 방식입니다. 전달하는 방식 전달하는 방식 전달하는 방식 3번 강조 큰 차이점은 데이터가 어디에 위치하는가에 있습니다. POST 요청시..

java119.tistory.com

글을 쓰는 이 순간에도 GET Parameter가 존재한다.

지금 URL을 보면

https://java119.tistory.com/manage/newpost/?type=post&Fsts

이렇게 되어있는데

 

이 부분이 GET Parameter가 된다.

manage/newpost/?type=post&Fsts

 

문법


F5 키보드 키를 눌러서 새로고침시 GET 파라미터 제거 새로고침 하기

window.onkeydown = function() {
var kcode = event.keyCode;
if(kcode == 116) {
history.replaceState({}, null, location.pathname);
}
}

코드 설명

1.window.onkeydown 사용자(클라이언트) 특정 키보드 키를 눌렀을 때

2.var kcode = event.keyCode; 무슨 키를 눌렀는지는 모르겠지만 아스키 코드값 kcode에 삽입

3.if(kcode == 116) { history.replaceState({}, null, location.pathname); // Get 파라미터 지우기 }

 

여기서 event.keyCode 116번은 뭘까? 왜 116번이 F5키 라는걸까? 바로 키보드 아스키 코드이다.

전체 키보드 아스키 코드표는 밑에 참고

 

 

그 외


일반적인 새로고침 (캐시가 있으면 캐시로 새로고침 HTTP 302).

window.location.reload(); 

 

강제 새로고침 (캐시 제거 파일 로드 HTTP 200)

window.location.reload(true);

 

GET 파라미터 제거 후 새로고침 

history.replaceState({}, null, location.pathname);

 

iframe 부모창 새로고침

 

[JSP] iframe 부모창 새로고침 및 링크타기

iframe 페이지에 그냥 location.reload()를 하게되면 해당 iframe 안에만 새로고침 된다.(링크도 마찬가지 그안에서 페이지가 변경됨) iframe 전체 페이지를 새로고침 하거나 링크하고 싶다면 location 부모 ifram..

java119.tistory.com

참고 : 키보드 아스키 코드표


키보드 아스키 코드표

 

반응형

[Spring] @Scheduled

2019. 10. 30. 19:18
반응형

@Scheduled Spring 3.1 이상부터 지원합니다.

 

1.Annotation 사용 방법

2.XML 사용 방법

 

글에서는 1.Annotation 사용 방법만 다루고 있습니다. 참고 바랍니다.

 

Annotation 설정

 

@Scheduled

 

개념


주기적인 작업이 있을 때 @Scheduled 애노테이션을 사용하면 쉽게 적용할 수 있다.

Linux 조금 배우신 분들이라면 Linux의 crontab이라고 생각하면 됩니.

 

 

사용 이유


특정시간 혹은 몇분 혹은 몇시간마다 동작해는 스케쥴러를 구현

주기적인 작업이 필요

 

문법


먼저 새로운 기술은 항상 그렇듯 XML 설정을 해줘야 한다.

 

새로운 XML 만들거나 기존에 쓰던 XML 다음과 같은 문구를 추가 한다.

 

1.새로운 XML 만들어 추가하는 방법

<!--?xml version="1.0" encoding="UTF-8"?-->
<beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:task="http://www.springframework.org/schema/task"
             xsi:schemalocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/task
        http://www.springframework.org/schema/task/spring-task-3.0.xsd">
    <task:annotation-driven>
</task:annotation-driven>
</beans>

 

2.기존 XML 추가하는 방법

xmlns:task="http://www.springframework.org/schema/task"
 xsi:schemalocation="
 http://www.springframework.org/schema/task
 http://www.springframework.org/schema/task/spring-task-3.0.xsd">
 <task:annotation-driven>
</task:annotation-driven>

 

사용 예시

@Scheduled(fixedDelay=1000)
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }

메소드 위에 @Scheduled 어노테이션을 붙여주면 끝이다.

 

cron은 CronTab에서의 설정과 같이 cron="0/10 * * * * ?" 과 같은 설정이 가능하고

 

fixedDelay은 이전에 실행된 Task의 종료시간으로 부터 정의된 시간만큼 지난 후 Task를 실행한다.

fixedRate은 이전에 실행된 Task의 시작시간으로 부터 정의된 시간만큼 지난 후 Task를 실행한다.

 

fixedDelay fixedRate 시간 단위는 밀리세컨드이다.

 

cron="0/10 * * * * ?" (리눅스 crontab 같은 설정방법)

람다식을 처음 마주한거같은 느낌은 뭘까?

 

cron 대해서 알아보자

 

 -초 0-59 , - * / 

 -분 0-59 , - * / 

 -시 0-23 , - * / 

 -일 1-31 , - * ? / L W

 -월 1-12 or JAN-DEC , - * / 

 -요일 1-7 or SUN-SAT , - * ? / L # (1:일, 2:월, 3:화, 4:수, 5:목, 6:금, 7:토)

 -년(옵션) 1970-2099 , - * /

 

* : 모든 값

? : 특정 값 없음

- : 범위 지정에 사용

, : 여러 값 지정 구분에 사용

/ : 초기값과 증가치 설정에 사용

L : 지정할 수 있는 범위의 마지막 값

W : 월~금요일 또는 가장 가까운 월/금요일

# : 몇 번째 무슨 요일 2#1 => 첫 번째 월요일

 

크론 표현식에서는 6~7 자리 가 사용됩니다.

cron = "* * * * * *"

 

왼쪽부터 작은 단위 [ 요일 (생략가능)]

왼쪽부터 작은 단위 [ 요일 (생략가능)]

왼쪽부터 작은 단위 [ 요일 (생략가능)]

 

가지 예시

 

[매일 오후 1시에 실행할 cron 만들기]

일단 0 0분이죠

@Scheduled(cron="0 0")

오후 1시래요 24 표기법이니까

@Scheduled(cron="0 0 13")

매일

@Scheduled(cron="0 0 13 * * ?")

 

[ 금요일 새벽5 30 실행할 cron 만들기]

0 30 새벽 5

@Scheduled(cron="0 30 05 ")

매주 금요일

@Scheduled(cron="0 30 05 * FRI ?")

 

자세한 문법 예시는 밑에

 

수많은 문법 예시

//1초 마다 실행
@Scheduled(fixedDelay=1000)
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }


//5초 마다 실행
@Scheduled(fixedDelay=5000)
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }


//10초 마다 실행
@Scheduled(fixedDelay=10000)
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }


//매일 5시에 실행
@Scheduled(cron="0 0 05 * * ?")
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }


//매월 2일,20일 새벽2시에 실행
@Scheduled(cron="0 0 02 2,20 * ?")
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }


//매월 마지막날 저녁 10시에 실행
@Scheduled(cron = "0 0 10 L * ?")
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }

//1시간 마다 실행 ex) 01:00, 02:00, 03:00....
@Scheduled(cron = "0 0 0/1 * * *")
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }


//매일 오후 18시마다 실행 ex) 18:00
@Scheduled(cron = "0 0 18 * * *")
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }

//매일 오후 18시00분-18시55분 사이에 5분 간격으로 실행
@Scheduled(cron = "0 0/5 18 * * *")
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }


//매일 오후 9시00분-9시55분, 18시00분-18시55분 사이에 5분 간격으로 실행
@Scheduled(cron = "0 0/5 9,18 * * *")
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }

//매일 오후 9시00분-18시55분 사이에 5분 간격으로 실행
@Scheduled(cron = "0 0/5 9-18 * * *")
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }

//매달 1일 00시에 실행
@Scheduled(cron = "0 0 0 1 * *")
    public void testScheduler(){
        System.out.println("스케줄링 테스트");

    }

//매년 3월내 월-금요일 10시 30분에만 실행
@Scheduled(cron = "0 30 10 ? 3 MON-FRI")
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }

 

여기서 잠깐!

스케줄 돌릴 메소드에 리턴타입과 매개변수를 없다.

 

디테일한 설정들

cron : cron 표현식을 지원한다. "초 분 시 일 월 주 (년)"으로 표현한다. cron 표현식에 쓸 수 있는 것들(특수문자 활용 포함)이 많은데

 

fixedDelay : milliseconds 단위로, 이전 작업이 끝난 시점으로 부터 고정된 시간을 설정한다.

@Scheduled(fixedDelay=5000)
public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }

fixedDelayString : fixedDelay와 같은데 property의 value만 문자열로 넣는 것이다.

@Scheduled(fixedDelay="5000")
public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }

fixedRate : milliseconds 단위로, 이전 작업이 수행되기 시작한 시점으로 부터 고정된 시간을 설정한다.

@Scheduled(fixedRate = 3000)
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }

fixedRateString : fixedDelay와 같은데 property의 value만 문자열로 넣는 것이다.

@Scheduled(fixedRate = "3000")
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }

initialDelay : 스케줄러에서 메서드가 등록되자마자 수행하는 것이 아닌 초기 지연시간을 설정하는 것이다.

@Scheduled(fixedDelay = 3000,initialDelay = 1000)
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }

initialDelayString : 위와 마찬가지로 문자열로 값을 표현하겠다는 의미다.

@Scheduled(fixedDelay = 3000,initialDelay = "1000")
    public void testScheduler(){
        System.out.println("스케줄링 테스트");
    }

zone : cron표현식을 사용했을 때 사용할 time zone으로 따로 설정하지 않으면 기본적으로 서버의 time zone이다.

 

다음은 동적으로 스케줄러를 멈추고 시간주기를 바꾸는 법에 대해 포스팅 하겠습니다.

반응형
반응형

Web Server

 

개념


클라이언트가 서버에 페이지 요청을 하면 요청을 받아 정적 콘텐츠(. html,. png,. css 등)를 제공하는 서버

 

정적 컨텐츠를 제공하는 서버!

 

HTTP 프로토콜을 기반으로 하여 클라이언트(웹 브라우저 또는 웹 크롤러)의 요청을 서비스하는 기능을 담당

 

1. 정적인 콘텐츠 제공

WAS를 거치지 않고 바로 자원을 제공한다.(. html. jpeg. css)

 

2. 동적인 콘텐츠 제공을 위한 요청 전달

클라이언트의 요청(Request)을 WAS에 보내고, WAS가 처리한 결과를 클라이언트에게 전달(응답, Response)한다.

 

클라이언트는 일반적으로 웹 브라우저(크롬, IE, FireFox 등)를 의미

 

 

사용 이유


누군가 이런 말을 한다. 요즘 WAS만 설치하면 웹 서버 기능도 다 하던데? 굳이 필요 있나?

그 이유를 설명합니다.

 

1. 서버 부하 방지

 

이미지 파일이 클라이언트에게 가는 과정

1-1. 클라이언트 접속 (www.naver.com)

1-2.HTML 문서 받음

1-3. 필요한 이미지 파일, JS 파일 받음

 

Web Server를 통해 정적인 파일들을 WAS까지 가지 않고 앞단에서 빠르게 보내줄 수 있다.

따라서 Web Server에서는 정적 콘텐츠만 처리하도록 기능을 분배하여

 

서버의 부담을 줄일 수 있다!!

 

2. 보안 강화

 

SSL에 대한 암호화, 복호화 처리에 Web Server를 사용!

 

3. 로드 밸런싱 ( Load Balancing )

 

fail over(장애 극복), fail back 처리에 유리

특히 대용량 웹 애플리케이션의 경우(여러 개의 서버 사용) Web Server와 WAS를 분리하여 무중단 운영을 위한 장애 극복에 쉽게 대응할 수 있다.

예를 들어, 앞 단의 Web Server에서 오류가 발생한 WAS를 이용하지 못하도록 한 후 WAS를 재시작함으로써 사용자는 오류를 느끼지 못하고 이용할 수 있다.

 

Load Balancing을 위해서 Web Server를 사용!

 

예시

WAS1 과부하 CPU 80% 이상

WAS2로 부하 분산

 

대표 Web Server 종류

Apache Server
Nginx
MS IIS

 

 

WAS(Web Application Server)

 

개념


동적 콘텐츠를 제공하기 위해 만들어진 애플리케이션 서버 (DB 조회, 로직 처리가 요구되는 콘텐츠)

 

동적 콘텐츠를 제공하는 서버!

 

“웹 컨테이너(Web Container)” 혹은 “서블릿 컨테이너(Servlet Container)”라고도 불린다

Container란 JSP, Servlet을 실행시킬 수 있는 소프트웨어를 말한다.

즉, WAS는 JSP, Servlet 구동 환경을 제공한다.

 

WAS는 JSP, Servlet 구동 환경을 제공!

 

 

사용 이유


WAS = Web Server + Web Container

Web Server 기능들을 구조적으로 분리하여 처리하고자 하는 목적으로 제시되었다.

분산 트랜잭션, 보안, 메시징, 스레드 처리 등의 기능을 처리하는 분산 환경에서 사용된다.

주로 DB 서버와 같이 수행된다.

현재는 WAS가 가지고 있는 Web Server도 정적인 콘텐츠를 처리하는 데 있어서 성능상 큰 차이가 없다.

 

1. 프로그램 실행 환경과 DB 접속 기능 제공

2. 여러 개의 트랜잭션(논리적인 작업 단위) 관리 기능

3. 업무를 처리하는 비즈니스 로직 수행

 

대표적 WAS 종류

Apache Tomcat
WildFly Jboss
TmaxSoft Jeus
IBM Web Sphere

Web Server와 WAS 차이 정리

Web Server : 정적

WAS : 동적

 

Web Server와 WAS를 따로 두는 이유 정리

1. 서버부하 방지

2. 하나의서버 혼용 Application (java, php.. 등)사용 가능

3. 로드밸런싱

즉, 자원 이용의 효율성 및 장애 극복, 배포 및 유지보수의 편의성을 위해 Web Server와 WAS를 분리한다.

 

명칭


1. 하나의 서버에 WEB,WAS, DB 설치 : single-Tier

2.WEB 서버 , WAS,DB 서버 : 2-Tier

3.WEB 서버 , WAS 서버 , DB 서버 : 3-Tier


[WAS] Cent 7 서버 구축해보기!

https://java119.tistory.com/8?category=811335

 

 

 

 

 

 

반응형
반응형

오늘은 Java 오버로딩(Overloading)과 오버라이딩(Overriding) 개 (개념) 이 (사용 이유) 문 (문법 및 예시) 시작하겠습니다.

시작하기에 앞서, 먼저 오버로딩과 오버라이딩의 공통점은

 

다형성을 지원하는 방법이다.

다형성을 지원하는 방법

다형성을 지원하는 방법

 

 

오버로딩(Overloading)

 

개념


같은 이름의 메소드를 여러 개 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술

 

 

조건


메소드 이름 동일해야됨

매개변수의 개수 또는 타입이 달라야.

매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.
(리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)

 

 

사용 이유


java내에서 제공하는 src.zip 내에 있는 java\lang\System.java을

뜯어보면

 

~ 대표적인 오버로딩으로는 System.out.println() 있다.

 

오버로딩이 만약 없다면?

void println()

void printlnBoolean(boolean x)

void printlnChar(char x)

void printlnString(String x)

void printlnDouble(double)

 

모두 근본적으로는 같은 기능을 하는 메서드들이지만, 서로 다른 이름을 가져야하기 때문에 메서드를 작성하는 쪽에서는 이름을 짓기 어렵고, 메서드를 사용하는 쪽에서는 이름을 일일이 구분해서 기억해야 하기 때문에 서로 부담이 된다.

 

하지만, 오버로딩을 통해 여러 메서드들이 println이라는 하나의 이름으로 정의될 수 있다면, println이라는 이름만 기억하면 되므로 기억하기도 쉽고 이름도 짧게할 수 있어서 오류의 가능성을 많이 줄일 수 있다. 그리고 메서드의 이름만 보고도 '이 메서드들은 이름이 같으니, 같은 기능을 하겠구나'라고 쉽게 예측할 수 있다.

 

문법


// Cosmetics.java file
public class Cosmetics {

public void produce(int water,int oil,int essence) {

System.out.println("제조 비율 "+water+"% "+oil+"% "+essence+"%");

}

public void produce(int water,int oil,int essence,int nmw) {

System.out.println("제조 비율 "+water+"% "+oil+"% "+essence+"%"+nmw+"% ");

}

public void produce(String execp) {

System.out.println("제조 불량 "+execp);

}

public void produce(double water,double oil) {

System.out.println("제조 비율 "+water+"% "+oil+"% ");

}
}

// Innis.java file
public class Innis {

public static void main(String[] args) {

Cosmetics co = new Cosmetics();

co.produce(20, 40, 60);
co.produce(20, 40, 20 , 20);
co.produce("불량품");
co.produce(22.33,55.6678);

}
}

설명 : 같은 produce 메소드이지만 매개변수,타입이 모두 다르다.

 

오버 라이딩(Overriding)

 

개념


상위 클래스가 가지고 있는 멤버변수가 하위 클래스로 상속되는 것처럼 상위 클래스가 가지고 있는 메소드도 하위 클래스로 상속되어 하위 클래스에서 사용할 수 있다. 하지만, 하위 클래스에서 메소드를 재정의해서 사용할 수 있다.

 

한마디로 상속 관계에 있는 클래스 간에 같은 이름의 메소드를 정의하는 기술

 

 

조건


메소드 이름 동일해야됨

매개변수,타입 동일해야됨

리턴타입이 동일해야됨

메소드의 static 예약어를 붙이면 안됨

 

 

사용 이유


그대로 재정의 사용합니다.

 

추상 클래스를 설명할 예로 들었던

화장품 클래스를 다시 꺼내서 설명하겠습니다.

 

화장품이라는 부모클래스를 상속 받는다.

기본 제조 메소드

40% + 기름 40% + 에센스 20%

 

이니x프리 클래스 상속 화장품

@오버라이딩

제조 메소드

70% + 기름 10% + 에센스 10% + 천연암반수 10% (추가)

 

올리x영 클래스 상속 화장품

@오버라이딩

제조 메소드

50% + 기름 49% + 에센스 1%

 

[Java] 상속이란?

 

[Java] 상속

오늘은 Java 상속 개 (개념) 이 (사용 이유) 문 (문법 및 예시) 시작하겠습니다. 개념 우리가 생각하는 상속이라는 단어가 맞다. 현실 세계에서 부모님이 자식들에게 재산을 물려주는 것과 비슷하다. 차이라고 하..

java119.tistory.com

 

문법

화장품 클래스 (부모)

public class Cosmetics {

public int water;
public int oil;
public int essence;

public void produce() {
System.out.println("제조 비율"+this.water+"% "+this.oil+"% "+this.essence+"%");
}

}

 

이니스x 클래스 (자식)

public class Innis extends Cosmetics {

int nmw;

@Override

public void produce() {
System.out.println("제조 비율 물 "+water+"% 기름 "+oil+"% 에센스 "+essence+"% 천연암반수 "+nmw+"% ");
}

}

 

구현 클래스

public class Ex {

public static void main(String[] args) {

Innis ins = new Innis();

ins.water = 20;
ins.oil = 20;
ins.essence = 20;
ins.nmw = 40;

ins.produce();

}
}

설명 : 이니스x프리 클래스가 화장품 클래스의 produce 메소드를 상속 받아 재정의 하였다.( int nmw을 추가)

 

+면접 단골 질문

오버로딩과 오버라이딩의 차이점

 

정리

1.오버로딩

같은 이름의 메소드를 여러 개 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술

코드의 통일성 , 효율성을 높일 있다.

2.오버라이딩

상속 관계에 있는 클래스 간에 같은 이름의 메소드를 정의하는 기술

 

둘의 공통점은 다형성을 지원하는 방법

반응형
반응형

DTO(Data Transfer Object)

 

개념


이름과 같이 계층 간 데이터 교환을 위해 사용하는 객체다.

*여기서 말하는 계층이란, View - Controller - Service - DAO와 같은 각 계층을 말한다.

VO와 혼용되어 쓰이나, 이는 보통 DTO를 지칭하는 말이다.

데이터를 담을 private 변수와 그 변수를 조작할 수 있는 Getter, Setter 메서드로 구성돼있음..

 

데이터를 오브젝트로 변환하는 객체 Getter, Setter 메서드로 구성!

 

 

사용 이유


form, ajax에서 name 필드 값을 프로퍼티에 맞춰서 값을 다른 페이지로 넘겼을 시 ,

값을 받아야 할 페이지에서는 값을 하나씩 일일이 받는 것이 아니라 name 속성의 이름이랑 매칭 되는 프로퍼티에 자동적으로 DTO가 인스턴스화 되어 UserDTO를 자료형으로 값을 받을 수 있음

 

말이 어려워졌는데, 한 상황으로 정리하겠습니다.

DB : 데이터 줄게

DAO : 일일이 담기 귀찮다. 딱 맞는 바구니에 담을 수 없을까?

DAO : 아 유레카! 주는 데이터에 맞춰서 데이터 형식들을 만들어 놓은

클래스를 만들어야겠군 이름은 DTO라고 불러야겠다.

 

DB 값 → DAO Service DTO

 

문법


List<Company>  result = menuservice.getCompanyList();
//getCompanyList() == select * from Company;
//DB 컬럼 이름에 맞춘 Company 클래스(DTO)에 자동으로 데이터 삽입됨
//예시 DTO
public class Company {

private int id;

private String name;

private String address;

private String registration_number;

private String representative;

private String description;

private String created_on;

private String updated_on;

public int getId() {
return id;

}

public void setId(int id) {
this.id = id;

}

public String getName() {
return name;

}

public void setName(String name) {
this.name = name;

}

public String getAddress() {
return address;

}

public void setAddress(String address) {
this.address = address;

}

public String getRegistration_number() {
return registration_number;

}

public void setRegistration_number(String registration_number) {
this.registration_number = registration_number;

}

public String getRepresentative() {
return representative;

}

public void setRepresentative(String representative) {
this.representative = representative;

}

public String getDescription() {
return description;

}

public void setDescription(String description) {
this.description = description;

}

public String getCreated_on() {
return created_on;

}

public void setCreated_on(String created_on) {
this.created_on = created_on;

}

public String getUpdated_on() {
return updated_on;

}

public void setUpdated_on(String updated_on) {
this.updated_on = updated_on;
}

@Override
public String toString() {
return "Company [id=" + id + ", name=" + name + ", address=" + address + ", registration_number="
+ registration_number + ", representative=" + representative + ", description=" + description
+ ", created_on=" + created_on + ", updated_on=" + updated_on + "]";
}
}

VO(Value Object)

 

개념


값을 가진 객체

데이터만 가지고 있다는 것만 보면 DTO와 비슷한데,

가장 큰 특징은 value가 같으면 같은 객체라고 보는 거예요.

Company a = new Company("대기업");
Company b = new Company("대기업");

a.hashCode();
b.hashCode();

해쉬 값이 동일하다. 즉 같은 것으로 판단

 

그리고  read-only 값을 가지고 있음 즉, 변하지 않는 immutable 한 성질을 가지고 있음. 중간에 값을 바꿀 수가 없음.

 

 

문법


DTO와 VO를 구분할 수 있는 아주 좋은 형태

get/set = DTO

get = VO

 

setter는 없고 getter만 있는 형태!

public class BoardVO {
	
	private int id;
	private String subject;
	private String context;
	private String attachments;
	private int likes;
	private int views;
	private int writer;
	private Date create_time;
	public int getId() {
		return id;
	}
	public String getSubject() {
		return subject;
	}
	public String getContext() {
		return context;
	}
	public String getAttachments() {
		return attachments;
	}
	public int getLikes() {
		return likes;
	}
	public int getViews() {
		return views;
	}
	public int getWriter() {
		return writer;
	}
	public Date getCreate_time() {
		return create_time;
	}
	
	@Override
	public String toString() {
		return "BoardVO [id=" + id + ", subject=" + subject + ", context=" + context + ", attachments=" + attachments
				+ ", likes=" + likes + ", views=" + views + ", writer=" + writer + ", create_time=" + create_time + "]";
	}
	
}

DTO VS HashMap


DTO 쓰지 않고 HashMap을 쓰면 안 될까?

 

가장 큰 이유는 compile time 오류와 관련 있습니다.

HashMap은 컴파일 시에 오류를 잡아내질 못합니다.

 

DTO

dto.setName("gildong");
String name = dto.getName();

HashMap

map.put("name", "gildong");
String name = map.get("name");

정리


HashMap 단점

 

1. 해쉬 맵은 get이나 put에서의 key가 잘못돼도 컴파일 시에는 에러를 잡아내질 못함.

     즉, map.put("names")라고 해도 에러가 나질 않죠.

     반면에, dto.steNames() 나 dto.getNames()는 에러가 나서 컴파일조차 되지 않을 겁니다.

 

2. 데이터 타입에 대한 에러를 잡아내질 못합니다.

    String인지 Integer인지를 컴파일 시에는 모르죠.

 

3. 해쉬 맵은 프로그램 말고도 별도의 정보가 필요합니다.

    dto는 그 자체가 필요한 정보를 담고 있습니다.

    name, address, age 등 dto의 정의만 봐도 대충은 알 수 있는데 반하여,

    해쉬 맵은 이 데이터를 정의한 다른 문서가 필요합니다.

    이는 규모가 큰 프로그램일수록 더 필요하죠.

 

HashMap 장점 및 사용 이유

 

1. 데이터의 필드들이 가변적인 경우

2. 매우 복잡한 구조로 되어 있어 DTO로 규정하기는 곤란한 경우

3. DTO가 너무나 많아지는 경우

4. 한 select 문 쿼리에 여러 개의 count 정보를 담을 때

5. 한번 쓸건데, 이걸 위해 DTO를 만들기도 뭐할 때

 

반응형

[Java] parseInt()와 intValue()

2019. 10. 29. 10:23
반응형

오늘은 Java parseInt() && intValue() 개 (개념) 이 (사용 이유) 문 (문법 및 예시) 시작하겠습니다 .

 

parseInt()

 

개념


static 이다, 그러므로 Integer 생성안하고 parameter만 넣어주면 메소드를 수행할 수 있다.   

쉽게 말하자면

string형 객체에서 int형 값을 뽑아내는 메소드이다. 

 

Integer 생성안한다

Integer 생성안한다

Integer 생성안한다

3번 강조

 

Integer 생성안한다 == 즉 Integer(Object) 라는 박스를 만들지 않고 (래퍼 클래스와 언박싱,박싱)

내용물(String) -> 내용물(int) 교체한다.

 

 

사용 이유


String형 객체에서 int형 값을 뽑아 내는 메소드

문자형을 정수형으로 만든다.

위 내용과 같이 내용물(String) -> 내용물(int) 교체 할 때 사용

 

 

문법


int 변수 = Integer.parseInt(숫자값으로 된 String);

 

바로 예시

String str = "119";

int i = Integer.parseInt(str);

 

 

 

 

intValue()

 

개념


static이 아니며 Integer 객체에서 int형 값을 뽑아내는 메소드이다

Integer는 (int Value와 String Value) 두 가지가 있다.

 

Integer 객체에서~

객체에서~

객체에서~

3번 강조

 

뽑아낸다 즉 Object -> int 이 말이다.

객체란 말이 뭔지는 모르겠지만 우리는 일단 하나의 박스라고 생각하자.

객체란 박스에서 내용물을 꺼내야 int 라는 내용물로 옮길 수 있다.

언박싱 해줘야 한다.

 

Integer -> 잇섭(언박싱) -> int 변환

 

사용 이유


객체에 내용 값을 정수로 변환하기 위함.

 

 

문법


Integer i = new Integer(150);
i.intValue();

 

바로 예시

int i = Integer.valueOf(str).intValue();

 

사용 사례

 

[Java] java.lang.ClassCastException

예외 상황1 원인 심각: Servlet.service() for servlet [appServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: java.lang.Long..

java119.tistory.com

 

정리

상황에 맞는 함수 쓰기

1.내용물 -> 내용물 형변환 Integer.parseInt()

2.객체 -> 내용물 변환 intValue();

 

 

 

 

반응형
반응형

예외 상황1

 

원인


심각: Servlet.service() for servlet [appServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer] with root cause

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer

 

클래스 형 변환(캐스팅) 연산을 잘못 했을 때 발생한 예외

 

HashMap 있는 숫자값으로 이루어진 Object(Wrapper) 정수형 DTO 언박싱 하려다가 예외문이다.

 

Object 객체를 int 바로 넣을려고 했다가 나온 예외다.

 

 

해결 시도


Integer.parseInt(Object)

parseInt() 사용하면 당연하게 알았지만..

 

심각: Servlet.service() for servlet [appServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer] with root cause

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer

 

 

 

해결


((Long) userService.getAttendanceList(currentUser)).intValue();

 

해결 코드 문법

HashMap<String, Object> result = new HashMap<>();
Dto_graph dto = new Dto_graph();

result = menuservice.serviceCount();
dto.setnServiceCount( ((Long) result.get("cnt1")).intValue() );
dto.setnFreeVMCount( ((Long) result.get("cnt2")).intValue()) ;
dto.setnVMCount( ((Long) result.get("cnt3")).intValue() );

 

예외 상황 정리

1.캐스팅 관련 예외 (잘못된 형변환)

 

 

예외 상황2

 

원인


참조한 라이브러리 안의 클래스가 중복되어 정확한 경로를 찾지 못하여 발생하는 것이다.

 

Java로 만든 프로그램 배포를 위해 톰캣(WAS)로 패키징을 하는 경우가 많다.

 

이 때 이클립스에서 잘 작동하던 프로그램이 패키징을 하고 나면 다음과 같은 에러가 발생할 때가 있다.

java.lang.ClassCastException : A cannot be cast to B

 

해결


톰캣은 최상위 lib 디렉터리에 톰캣 관련 라이브러리를 넣고 WEB-INF 밑의 lib 디렉터리에 자바 라이브러리를 넣는다.

 

에러의 원인은 참조한 라이브러리 안의 클래스가 중복되어 정확한 경로를 찾지 못하여 발생하는 것이다.

 

따라서 두개의 lib 디렉터리 중 한군데에만 적용을 시켜주면 해결이 된다.

 

 

예외 상황2 정리

1.참조하는 라이브러리 경로 문제.

2.멀쩡하던게 다른데로 옮겼다고 예외가 뜨면 경로 문제가 대부분이다.

반응형

'java' 카테고리의 다른 글

[Java] 오버로딩(Overloading)과 오버라이딩(Overriding)  (0) 2019.10.30
[Java] parseInt()와 intValue()  (0) 2019.10.29
[Java] 상속  (0) 2019.10.27
[Java] 추상 클래스  (0) 2019.10.26
[Java] 예약어 정리  (2) 2019.10.23

[Java] 상속

2019. 10. 27. 22:52
반응형

오늘은 Java 상속 개 (개념) 이 (사용 이유) 문 (문법 및 예시) 시작하겠습니다.

 

개념


우리가 생각하는 상속이라는 단어가 맞다. 현실 세계에서 부모님이 자식들에게 재산을 물려주는 것과 비슷하다. 이라고 하면 자식(클래스)이 상속받고 싶은 부모(클래스)를 선택해서 물려받는다. 이때 상속받는 클래스를 자식 클래스, 하위 클래스 또는 서브 클래스라고 부른다. 상속을 해주는 클래스를 부모 클래스, 상위 클래스 또는 슈퍼 클래스라고 한다

 

부모 클래스(parent class) 와 자식 클래스(children class)는 자바 예약어 extends 정해짐

 

 

 

 

사용 이유


중복된 코드를 줄일 수 있고, 유지 보수가 편리하며, 통일성이 있고 다형성을 구현

 

 

 

 

문법


 

하나의 부모- 여러 자식 O

하나의 자식 - 여러 부모 X

 

자식 - 부모 클래스의 자원을 모두 사용 가능

  • 자식클래스도 부모 클래스가 있음
  • 부모 클래스가 상속받은 자원도 사용 가능 (조상 클래스의 자원)
  • 부모 클래스로부터 받은 자원을 Override 하여 수정 가능

부모 - 자식 클래스 자원 사용 X

 

바로 예시

 

회사 클래스 (최상위 - 조상)

public class Company{}

 

부서 클래스 (상위 - 부모)

public class Department{}

 

회사원 클래스 (하위 - 자식)

public class Employee{}

 

public class Employee extends Department (부서를 상속 받은 회사원 클래스)
//Employee(자식)는 조상 클래스 Company의 자원까지 모두 사용 할 수 있다.

public class Department extends Company (회사를 상속 받은 자식클래스 부서)

public class Company (최상위 회사)

 

※주의

자식 클래스가 부모 클래스로부터 상속을 받게 되면 부모 클래스의 필드와 메서드를 물려받게 된다. 단, 접근제어자가 private을 갖는 필드나 메소드는 상속이 불가하고, 패키지가 다를 경우 접근제어자가 default인 경우도 상속이 불가하다.

 

 

 

정리

1. 상속 방법 : class 클래스(자식) extends 클래스(부모)

2. 자식 클래스는 부모 클래스로부터 메소드와 필드를 물려받아 사용한다. 부모 클래스는 자식 클래스에서 정의한 메소드나 필드를 사용하지 못한다.(자식 = 자신 + 부모 / 부모 = 자신)

3. 자식 클래스는 여러 부모 클래스로부터 상속받지 못한다. 즉, 단일상속만 가능하다.

4. 부모 클래스는 여러 자식 클래스에게 상속이 가능하다.

5. 자식 클래스가 더 다양한 기능이 가능하므로 자식 클래스로 인스턴스를 생성하는 것이 효율적이다.

6.접근제어자가 private 갖는 필드나 메소드는 상속이 불가하다.

    

 

반응형

'java' 카테고리의 다른 글

[Java] parseInt()와 intValue()  (0) 2019.10.29
[Java] java.lang.ClassCastException  (0) 2019.10.28
[Java] 추상 클래스  (0) 2019.10.26
[Java] 예약어 정리  (2) 2019.10.23
[Java] 지역변수와 전역변수  (1) 2019.10.23

+ Recent posts