#Spring Boot와 JSP

 

 

우연히 Spring Boot를 https://start.spring.io/ 라는 사이트에서

프로젝트를 만들어 보았다.

 

평소같으면 기존 Spring Boot 프로젝트에서

틀이나 내용을 복붙해서 가져왔겠지만

 

새로운 스프링 부트 프로젝트를 만드는 연습을 한다고 생각하고

아무것도 복붙하지 않고 만들어 보았다.

 

그런데 왠걸...?

Hello World조차 화면에 나타내지 못했는데 5시간이 지났다.

아무리 설정파일을 고치고

기존 프로젝트를 참고해 똑같은 라이브러리를 깔고

톰캣을 8버전으로 낮춰도 보고

스프링 부트 버전을 여러번 바꿔도 보았지만

스프링 부트는

도무지 hello.jsp 파일을 찾지 못했다.

다른 점은 한가지 있긴 했다.

WEB-INF 폴더 밑이 아닌 templates 폴더 밑에 jsp 파일을 넣은 것이다.

 

templates 폴더 밑에 html파일은 읽히지만

jsp파일은 읽히지 않았다.

 

스프링 부트에서 jsp를 적용하려면

스프링 프로젝트처럼 webapp/WEB_INF/ 하위에 위치시키고

properties나 yml에서 경로를 설정해줘야 jsp파일을 사용할 수 있었다.

스프링 공식문서에 보면 내장된 서블릿 컨테이너에는 jsp 제한사항이 있다.

스프링 부트는 가능하다면 jsp를 피하고

Thymeleaf와 같은 템플릿 엔진을 사용하라고 권장한다.

국비교육에서 처음 스프링 부트를 배웠을 때

jsp로도 실습을 했었고

templates 폴더 안에 html 파일을 넣고 프로젝트까지 진행도 했었다.

 

원래는 강사님이 스프링 부트에서 jsp를 사용할 때

주의할 점이나 이유에 대해서 설명해 주셨었다.

그러나 시간이 지나면서

다 잊어버렸고

이제서야 희미하게 기억이 났다.

 

역시나

수업을 듣는다고 모든 내용을 흡수할 수 있는 것은 아니다.

이처럼

삽질도 하고 피부로 직접 느껴봐야

피가 되고 살이 되나보다.

스프링 공식문서 링크

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-spring-mvc-template-engines

 

 

Made by 꿩

'IT > Java' 카테고리의 다른 글

추상클래스와 인터페이스  (0) 2018.11.11
다형성  (0) 2018.11.03
object vs instance vs class  (3) 2018.10.24

# 추상클래스와 인터페이스



추상화란 형태를 잡는 것이다.

미술에서 추상화는 구체적인 형상을 나타내는 것이 아니라

점, 선, 면, 색과 같은 순수한 조형 요소로 표현한 것이다.

프로그래밍에서 추상화도 마찬가지이다.

구체적인 코드를 짜는 것이 아니라

기본 틀을 잡고 가는 것이다.


추상클래스와 인터페이스는 모두 추상화에 포함된다.

추상클래스는 메소드의 내용을 구현할 수 있는 것과 달리

인터페이스는 명시만 되어있다.

인터페이스가 추상클래스보다 더 추상화된 형태라고 보면 된다.


그렇다면 왜 추상화란 개념이 프로그래밍에 적용이 될까?

바로 다른 사람과의 커뮤니케이션 때문이다.


같이 프로그램 코드를 짜고 있는 상황에서

다른 사람이 어떤 이름의 객체, 메소드를 만드는 지 모른다면

다른 사람의 만든 객체를 내가 쓸 수 없다.

혹은 다른 사람의 일이 다 끝나야 내가 코드를 완성시킬 수 있다.


그러나 인터페이스를 이용하여 먼저 약속을 해놓으면

상대방의 코드 내용을 알지 못해도

나는 내 코드를 완성시킬 수 있다.

일반적으로는

인터페이스 -> 추상클래스 -> 구현클래스

이 3단계로 프로그램 코드를 완성했다.

그러나

자바 8버전 부터는 인터페이스에 디폴트 메소드가 생겼다.

인터페이스도 제한적이지만 메소드를 구현할 수 있게 되면서

추상클래스를 꼭 만들 필요성이 없어졌다.

그렇다면 추상클래스를 이제 쓸 필요가 없어졌는가?

아니다.

인터페이스가 추상클래스의 역할 전부를 대체할 수 없다.

인터페이스는 여전히 상수변수만을 쓸 수 있다.

그렇기에 객체변수를 선언할 필요가 있는 경우엔

추상클래스가 필요하다.


참고로 자바 8버전부터 디폴트 메소드로 인해

스프링에서 몇몇 추상클래스가 Deprecated 되었다.

한마디로 더이상 못쓴다는 것이다.


예를 들어,

WebMvcConfigurerAdapter라는 추상클래스가 있다.


자바 8버전을 베이스로 만든 스프링 5버전 부터는 쓸 수 없다고 나온다.

이 추상클래스가 Deprecated 된 이유는

앞서 말했듯이 바로 디폴트 메소드의 추가로 인해 생겼다.

혹여나 옛날 코드를 참고해 코드를 짜면 에러가 생길 수 있으므로 참고하길 바란다.


To be continued.........




Made by 꿩



'IT > Java' 카테고리의 다른 글

Spring Boot와 JSP  (0) 2019.08.02
다형성  (0) 2018.11.03
object vs instance vs class  (3) 2018.10.24

# 다형성


나는 게임을 못한다.

가끔씩 LOL을 하는데

너무나 쉽게 내 행동을 간파당해서

라인전이 망하고 한타에서도 진다.

그렇다고 오버워치를 하면 

딜러가 힐러보다 딜을 못하는 상황을 만들어낸다.

네 그렇습니다.

LOL, 오버워치 모두 실버유저입니다.

ㅠㅠ

그래서 가끔 게임이 하기 싫어질 때가 있는데

그럴때마다 하는 게임이 있다.

바로!!!!

추억의 게임인 포켓몬스터 골드버전!!!!



이 게임의 두가지 특징이 얘기해보려 한다.


첫번째

포켓몬은 몬스터볼로 잡을 수 있어서

컴퓨터와 싸움을 하면

포켓몬들은 모두 몬스터볼에서 나온다.


두번째

골드버전은 이전버전과 다르게

포켓몬에게 아이템을 소지할 수 있다.

아이템에 따라 포켓몬에게 적용되는 효과가 달라진다.



이 두가지 특징이 다형성과 연결된다.

다형성다양한 형태를 가질 수 있는 특징을 말한다.


어디서 많이 들어봤던

오버라이딩과 오버로딩이 바로 다형성의 예이다.


<오버라이딩>


먼저, 오버라이딩은 상위 클래스가 가지고 있는 메소드를

하위 클래스가 재정의 해서 사용한다는 것이다.


몬스터볼이라는 상위 클래스를 상속받아

모든 포켓몬스터를 몬스터볼로 꺼내고 돌아오게 할 수 있다.

 예를 들어 다음의 코드와 같다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class PocketMonster {
 
    public static void main(String[] args){
 
        //포켓몬 만들기?!
        MonsterBall pikachu = new Pikachu();
        MonsterBall yadon = new Yadon();
 
        //피카츄 꺼내기
        pikachu.getout();
        //피카츄 불러들이기
        pikachu.comeback();
 
        //야돈 꺼내기
        yadon.getout();
        //야돈 불러들이기
        yadon.comeback();
 
    }
 
    static class MonsterBall{
 
        public void getout(){
            System.out.println("포켓몬 꺼내기");
        }
 
        public void comeback(){
            System.out.println("포켓몬 불러들이기");
        }
 
    }
 
    static class Pikachu extends MonsterBall {
 
        @Override
        public void getout() {
            System.out.println("피카츄 꺼내기");
        }
 
        @Override
        public void comeback() {
            System.out.println("피카츄 불러들이기");
        }
    }
 
    static class Yadon extends MonsterBall{
 
        @Override
        public void getout() {
            System.out.println("야돈 꺼내기");
        }
 
        @Override
        public void comeback() {
            System.out.println("야돈 불러들이기");
        }
    }
 
}
 
cs


피카츄와 야돈은 모두 몬스터볼(부모 클래스)를 상속받는다.

둘 모두 몬스터볼의 메소드를 사용할 수 있고

각자에 맞게 바꿀 수도 있다.


몬스터볼을 가지고

피카츄를 내보낼 수 있고

야돈을 내보낼 수 있다.


겉모습은 몬스터볼인데

피카츄, 야돈을 모두 생성(?!)할 수 있는

다형성의 예이다.


<오버로딩>


오버로딩은 하나의 클래스에서 같은 이름의 메소드가 있지만

파라미터에 따라 다르게 동작한다.


포켓몬에게 아이템을 소지할 수 있는데

아이템에 따라 다른 효과를 적용할 수 있다.

 예를 들어 다음의 코드와 같다.


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
public class PocketMonster {
 
    public static void main(String[] args) {
        
        //꼬부기 생성?!
        Kkobugi kkobugi = new Kkobugi();
 
        kkobugi.item(new HappyEgg());
        kkobugi.item(new LearningDevice());
    }
 
    public static class Kkobugi{
 
        public void item(HappyEgg happyEgg){
            System.out.println("지닌 포켓몬이 받는 경험치의 양을 1.5배로 상승시킵니다.");
        }
 
        public void item(LearningDevice learningDevice){
            System.out.println("배틀에 나간 포켓몬과 경험치를 나눠 받을 수 있습니다.");
        }
    }
 
    //행복의알
    public static class HappyEgg{ }
    //학습장치
    public static class LearningDevice{ }
 
}
 
cs


아이템이라는 메소드 이름은 동일하지만

꼬부기에게 어떤 아이템을 주느냐에 따라

효과가 달라지는 것을 볼 수 있다.


같은 이름의 메소드에서

어떤 파라미터를 주느냐에 따라

다른 결과를 나타낼 수 있는 다형성의 예이다.



다형성이 있다면 코드를 편하게 짤 수 있다.

새로운 포켓몬을 등록할 때

몬스터볼의 기능인 넣었다 뺐다하는 기능을

포켓몬에게 일일히 다 써줄 필요가 없고

그냥 몬스터볼을 상속만 시켜주면

몬스터볼의 기능을 사용할 수 있다.


이처럼 다형성을 이용한다면 개발의 효율성을 높일 수 있다.


To be continued.........




Made by 꿩

'IT > Java' 카테고리의 다른 글

Spring Boot와 JSP  (0) 2019.08.02
추상클래스와 인터페이스  (0) 2018.11.11
object vs instance vs class  (3) 2018.10.24

# Object  vs Instance vs Class

Java를 처음 공부하면서 객체지향의 원리가 이해가 가지 않았다.

특히, 객체와 인스턴스의 차이는 도저히....

알고보니

클래스는 붕어빵 틀

인스턴스는 붕어빵

객체는 붕어빵이라는 음식이었다.


<클래스>

내가 붕어빵을 만든다고 가정하자.

붕어빵을 만들려면 역시나 붕어빵 틀은 필수템이다.

이것만 있으면 붕어빵을 쉽게 여러개 만들 수 있다.

클래스도 마찬가지이다.

클래스는 붕어빵 틀처럼 설계도라고 생각하면 된다.

설계도 하나로 대량생산을 하는 것처럼

클래스 안에 만들고자 하는 것에 대한 정보를 넣고 객체를 대량생산 하는 것이다.


<인스턴스 & 객체>

클래스는 쉽게 이해가 갔지만 문제는 인스턴스와 객체의 차이가 너무 모호했다.


보통 붕어빵 틀로 붕어빵을 만든다.

붕어빵 틀로 만들어낸 붕어빵을 인스턴스라 하고

객체는 그저 붕어빵을 가리키는 것일 뿐이다.


이 설명만 들어서는 조금 헷갈릴 수 있다.

" 아 붕어빵 먹고싶다."라고 말할 때

붕어빵은 붕어빵을 가리킨다.

이것을 객체라 한다.


인스턴스는 단순히 붕어빵 틀로 붕어빵을 만들어 냈을 때

이 붕어빵을 인스턴스라 한다.

즉, 메모리에 적재된 것을 인스턴스라 하고

객체는 그냥 그것을 가리키는 것이라 생각하면 된다.




To be continued.........




Made by 꿩


'IT > Java' 카테고리의 다른 글

Spring Boot와 JSP  (0) 2019.08.02
추상클래스와 인터페이스  (0) 2018.11.11
다형성  (0) 2018.11.03

+ Recent posts