프로그래머스 level 1 : 제일 작은 수 제거하기

 

  • 문제설명

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

  • 제한조건

arr은 길이 1 이상인 배열입니다.

인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.

 

  • 입출력 예

문제풀이

class Solution {
    public int[] solution(int[] arr) {
        int[] answer = {};
        if(arr.length==1){
            answer = new int[1];
            answer[0] = -1;
        }else{
            answer = new int[arr.length-1];
            int min = arr[0];
            
            for(int i=0; i<arr.length; i++){
                min = Math.min(min, arr[i]);
            }
            int index = 0;
            for(int i=0; i<arr.length; i++){
                if(min == arr[i]){
                    continue;
                }
                answer[index] = arr[i];
                index++;
            }
        }
        return answer;
    }
}

 

풀이설명

우선 arr.length==1 조건을 주어 answer에 -1의 값을 넣어주고, 그렇지 않을 경우 최소값을 빼서 저장하기 위해 answer의 길이는 arr.length-1로 지정하여 준다.

Math.min함수를 사용하여 arr배열의 최소값을 구한 후 for문을 사용하여 최소값일 경우 continue를 사용, 아닐경우 answer에 값을 넣어준다.

 

프로그래머스 level 1 : 같은 숫자는 싫어

 

  • 문제설명

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,

  1. arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
  2. arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.

배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

 

  • 제한사항
  1. 배열 arr의 크기 : 1,000,000 이하의 자연수
  2. 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

 

  • 입출력 예

 

문제풀이

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        int count = 1;
        for(int i=1; i<arr.length; i++){
          if(arr[i-1] != arr[i]){
             count++;
          }
        }
        
        int [] answer = new int [count];
        int index = 1;
        answer[0]=arr[0];
        for(int i=1; i<arr.length; i++){
          if(arr[i-1] != arr[i]){
              answer[index]= arr[i];
              index++;
          }
        }

        return answer;
    }
}

 

풀이설명

for문을 사용하여 연속되는 숫자가 아닐 경우의 수를 구하여 answer 배열의 크기로 지정한 후

answer의 첫번째 인덱스에는 arr배열의 첫번째 인덱스의 값을 넣어준 후

동일한 for문을 사용하여 연속되는 숫자가 아닐 경우의 수를 answer배열에 넣어준다.

웹 크롤링이란 ?

web, xml, json을 통해서 데이터를 수질할 수 있는 기능 (Web page의 tag를 통해서 데이터를 취합)

 

데이터 수집 : Java(jsoup), python(Beautiful Soup) - 제일 어렵다.

데이터 정형화 : 필요없는 문자 추려내기, 문자 검토하여 단어 형태로 만들어 놓는 것, (일반 -> 배열, 리스트)

분석 : 머신러닝

결과의 시각화 : app, web

 

우선 jsoup.jar파일이 필요하다.

https://mvnrepository.com/

해당 사이트에서 파일 다운로드가 가능하다.

 

다이나믹 웹 프로젝트의 lib폴더에 다운받은 jar파일을 추가한다.

Jsoup : 각종 사이트(HTML)에서 데이터를 취합할 수 있는 Library

 

 

데이터를 크롤링 할 사이트를 선택한다.

필자는 CGV 무비 차트 사이트에서 크롤링을 해보려 한다.

 

해당 사이트에 들어가 페이지 소스보기를 클릭한다.

해당 사이트의 html문서가 열리게 된다. 

이곳에서 가져올 정보의 태그명과 클래스명 또는 아이디명을 가져온다.

 

 

예제 Class

import java.io.IOException;


import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class MainClass {
	public static void main(String[] args) throws IOException {

		// 자료를 가져올 사이트에 연결하기
		Document doc = Jsoup.connect("http://www.cgv.co.kr/movies/").get();
	//	System.out.println(doc.data()); // html 코드를 가져온다.
    
    
		/* 크롤링 예시
		 <div class="box-contents">
                        <a href="/movies/detail-view/?midx=82986">
                            <strong class="title">블랙 위도우</strong>
                        </a>
                        
         <div class="score">
                            <strong class="percent">예매율<span>23.2%</span></strong>
                            <!-- 2020.05.07 개봉전 프리에그 노출, 개봉후 골든에그지수 노출변경 (적용 범위1~ 3위)-->
                            <div class='egg-gage small'>               
		 */
		
		Elements titles = doc.select("div.box-contents strong.title");
		// 묶기전 큰 묶음부터 묶어주는게 좋다.
		Elements percents = doc.select("div.box-contents div.score strong.percent span");
		for (int i = 0; i < 7; i++) {
			Element title = titles.get(i);
			Element percent = percents.get(i);
			System.out.println(title.text() + " : "+ percent.text()); // 보고있는 사이트의 영화 제목을 다 가져온다.
		}
	}
}

 

Document

해당 사이트의 html 문서 전체

connect(url).get()

자료를 가져올 사이트에 연결하기

Elements

select로 접근한 요소에 관련된 Element 데이터를 담는 자료형

Element

select로 접근한 요소

 

 

실행결과

블랙 위도우 : 21.7%
랑종 : 14.6%
이스케이프 룸 2-노 웨이 아웃 : 5.8%
크루엘라 : 1.8%
꽃다발 같은 사랑을 했다 : 0.8%
오필리아 : 0.7%
(월간오페라)카발레리아 루스티카나 : 0.3%

 

 

스프링의 의존성 관리방법

스프링 프레임워크의 특징 : 객체의 생성과 의존관계를 컨테이너가 자동으로 관리한다.(IoC)

 

IoC 지원 형태

Dependency Lookup

컨테이너가 애플리케이션 운용에 필요한 객체를 생성하고 클라이언트는 컨테이너가 생성한 객체를 검색하여 사용하는 방식(실제 개발에서 사용하지 않는다.)

 

Dependency Injection

객체 사이의 의존관계를 스프링 설정 파일에 등록된 정보를 바탕으로 컨테이너가 자동으로 처리해 준다. 따라서 의존성 설정을 바꾸고 싶을 때 프로그램 코드를 수정하지않고 스프링 설정 파일 수정만으로 변경사항을 적용할 수 있다.(유지보수 향상)

컨테이너가 직접 객체들 사이에 의존관계를 처리하는 것.

DI는 Setter Injection과 Constructor Injection으로 나뉜다. (두 방법 모두 멤버변수를 원하는 값으로 설정하는 것을 목적으로 하고 있어 결과 값은 같다.)

 

Constructor Injection : 스프링 설정파일에 <constructor-arg> 를 사용한다. <bean> 태그 안에서 선언한다.

 

<constructor-arg> 태그 속성 설명

ref  생성자 인자로 전달할 객체의 아이디를 참조한다.
value  매개변수로 전달된 데이터가 기본형타입일 때 사용, 매개변수로 전달될 값 지정.
index  매개변수의 번호(순서) 지정

 

xml 파일 예시

<bean id="tv" class="polymorphism.SamsungTV" init-method="initMethod" destroy-method="endMethod" lazy-init="true" scope="singleton">
		
		<!-- Constructor Injection -->
		<constructor-arg index="0" ref="apple"/>
		<constructor-arg index="1" value="270000"/>
		
</bean>
	
<bean id="sony" class="polymorphism.SonySpeaker"/>
<bean id="apple" class="polymorphism.AppleSpeaker"/>



Setter Injection : 스프링 설정파일에 <constructor-arg>대신 <property> 를 사용한다. <bean> 태그 안에서 선언한다.

 

<property>태그 속성 설명

name   속성값은 호출하고자 하는 메소드 이름 (속성값이 speaker이면 setSpeaker()를 호출한다.)
ref   setter 메소드를 호출하면서 다른객체를 인자로 넘길 때 사용.
value   매개변수로 전달된 데이터가 기본형타입일 때 사용, 매개변수로 전달될 값 지정.

 

xml 파일 예시

<bean id="tv" class="polymorphism.SamsungTV" init-method="initMethod" destroy-method="endMethod" lazy-init="true" scope="singleton">
		
		<!-- Setter Injection -->
		<property name="speaker" ref="sony"></property>
		<property name="price" value="270000"></property>
		
</bean>
	
<bean id="sony" class="polymorphism.SonySpeaker"/>
<bean id="apple" class="polymorphism.AppleSpeaker"/>

 

 

참조 문헌 - 스프링 퀵 스타트

참조글의 4) bean.xml 생성 부분을 참조하면 된다. 파일 네임만 작성 후 finish를 하면 아래 코드와 같은 파일이 완성된다. (네임 스페이스의 체크박스 추가 X)

 

 

<beans> 태그 

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

루트 엘리먼트이다. 스프링 컨테이너는 <bean> 저장소에 해당하는 XML설정 파일을 참조하여 <bean>의 생명주기를 관리하고 여러가지 서비스를 제공한다.
STS를 이용하여 만든 스프링 설정 파일에는 beans 네임스페이스가 기본 네임스페이스로 선언되어 있으며, spring-beans.xsd 스키마 문서가 schemaLocation으로 등록되어있다.
따라서, 사용할 수 있는 자식 엘리먼트는 <bean>, <description>, <alias>, <import> 이다.

 

BeanFactory는 인스턴스를 생성하고 설정하고 많은 수의 bean을 관리하는 실질적인 컨테이너

 

<bean> 태그

<bean id="tv" class="polymorphism.SamsungTV" init-method="initMethod" 
      destroy-method="endMethod" lazy-init="true" scope="singleton"/>

스프링 설정 파일에 클래스를 등록 할때 사용한다.

<beans> 태그 안에 위치해야 한다.

 

<bean> 속성

속성명 속성 정리
id 속성값은 고유한 식별값이여야 한다.(카멜케이스 사용), 컨테이너로부터 <bean> 객체를 요청할 때 사용
name 고유한 식별값이여야하지만, id와 다르게 작성 규칙이 존재하지 않음. (더 명확한 id를 많이 사용한다.)
class 생략할 수 없는 속성이다. 속성값은 연결할 class의 패키지명.클래스명이다(정확하게 등록해야 한다.)
init-method 스프링 컨테이너에서 객체를 생성할 때 기본생성자를 호출한다. 객체 생성후 바로 실행되는 메소드 지정할 수 있다. (Serlvet객체의 멤버변수의 초기화 작업이 필요하다면 사용) 속성명은 연결한 클래스의 메소드 명이다.
 destroy-method 스프링 컨테이너가 객체를 삭제하기 직전에 호출될 임의의 메소드를 지정한다.
lazy-init  스프링에서 컨테이너가 구동되는 시점에 <bean> 객체를 생성한다. (메모리 관리 비효율적)
lazy-init의 속성값을 true로 설정하면  <bean>이 사용되는 시점에서 객체를 생성한다.(메모리 관리에 효율적) 
scope 컨테이너가 생성한 bean을 어느 범위에서 사용할 수 있는지를 지정할 때 사용.
기본값은 singleton(단 하나만 생성되도록 운용)이다.
속성값으로 prototype을 설정하면 매번 새로운 객체가 생성된다.

 

Bean에 연결한 Class 예시

package polymorphism;

public class SamsungTV implements TV{
	public SamsungTV() {
		System.out.println("===>SamsungTV 객체 생성 ");
	}
	
    public void initMethod() {
		System.out.println("객체 초기화 작업 처리...");
	}
	
	public void powerOn() {
		System.out.println("SamsungTV---전원 켠다.");
	}
	
    public void powerOff() {
		System.out.println("SamsungTV---전원 끈다.");
	}
	
    public void volumeUp() {
		System.out.println("SamsungTV---소리 올린다");
	}
	
    public void volumeDown() {
		System.out.println("SamsungTV---소리 내린다");
	}
	
	public void endMethod() {
		System.out.println("객체 삭제전 처리할 로직 처리...");
	}
}

상속받은 인터페이스는 생략....

 

생성한 XML파일을 자바에 연결 하는 방법

package polymorphism;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class TVUser {
	public static void main(String[] args) {
				
		AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
				
		TV tv = (TV)factory.getBean("tv");
		tv.powerOn();
		tv.volumeUp();
		tv.volumeDown();
		tv.powerOff();
		
		factory.close();
	}
}

 

GenericXmlApplicationContext 

파일 시스템이나 클레스 경로에 있는 XML 설정 파일을 로딩하여 구동하는 컨테이너

파라미터에 xml파일의 filename을 작성한다.

 

getBean의 파라미터엔 bean태그의 id속성값을 작성한다.

 

 

실행화면 

INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]
INFO : org.springframework.context.support.GenericXmlApplicationContext - Refreshing org.springframework.context.support.GenericXmlApplicationContext@75a1cd57: startup date [Sun Jul 18 16:02:46 KST 2021]; root of context hierarchy
===>SamsungTV 객체 생성 
객체 초기화 작업 처리...
SamsungTV---전원 켠다.
SamsungTV---소리 올린다
SamsungTV---소리 내린다
SamsungTV---전원 끈다.
INFO : org.springframework.context.support.GenericXmlApplicationContext - Closing org.springframework.context.support.GenericXmlApplicationContext@75a1cd57: startup date [Sun Jul 18 16:02:46 KST 2021]; root of context hierarchy
객체 삭제전 처리할 로직 처리...

 

 

 

 

참조 문헌 - 스프링 퀵 스타트

AOP(Aspect Oriented Programming)란?

직역으로 관점지향 프로그래밍이다.

프로젝트에서 공통 부분을 처리한다. 예) log 처리, session 체크, DB체크  

 

Log 사용 예시

 

1) 이클립스에서 Dynamic Web Project를 생성한다.

2) pom.xml을 생성한다. ( 프로젝트 우클릭 → Configure →  Convert to Maven Project )

3)  pom.xml 에서 </build> 태그 밑에 코드를 추가한다.

 

pom.xml  코드 예시

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>testAOP</groupId>
  <artifactId>testAOP</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <release>16</release>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.3</version>
      </plugin>
    </plugins>
  </build>
  
    <dependencies>
  
  	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-webmvc</artifactId>
	    <version>5.3.6</version>
	</dependency>
	
	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-aop</artifactId>
  		<version>5.3.6</version>
  	</dependency>
	
	<dependency>
	    <groupId>org.aspectj</groupId>
	    <artifactId>aspectjweaver</artifactId>
	    <version>1.9.4</version>
	</dependency>
	
	<dependency>
	    <groupId>org.aspectj</groupId>
	    <artifactId>aspectjrt</artifactId>
	    <version>1.9.4</version>
	</dependency>
	
	</dependencies>
</project>

 

추가 후 pom.xml을 저장하면 Maven Dependencies가 생성되고 jar파일이 추가된 것을 볼 수 있다.

 

4) bean.xml 파일을 생성한다.

 

파일 생성 방법

src/main/java 우클릭 후 New → Other.. 클릭한다.

 

 

java 폴더안에 Spring Bean Configuration File 클릭 후 Next > 클릭

 

File name 작성 후 Next > 클릭

 

aop, beans 체크 후 Finish 한다.

 

생성된 bean.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:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

</beans>

5) Log에서 불러올 Dto Class를 생성한다.

 

Dto Class 예시

package com.dto;

public class Cat {
	private String name;
	private int age;
	private String color;
	
	public Cat() {}

	public Cat(String name, int age, String color) {
		super();
		this.name = name;
		this.age = age;
		this.color = color;
	}

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}
	
	public void info() {
		System.out.println("이름 : " + name);
		System.out.println("나이 : " + age);
		System.out.println("컬러 : " + color);
	}
}

 

변수 생성 후 info 메소드를 작성한다.

 


6) Log AOP를 사용할 클래스를 생성한다. 

 

LogAop Class 예시

package com.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class LogAop {
	
	// 패키지명 안에 있는 어떤 클래스든 호출될 때 무조건 들어와서 실행된다.
	@Around("within(com.dto.*)")
	public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable{
		// 신호과 왔을때
		String signatureStr = joinpoint.getSignature().toShortString();
		
		System.out.println(signatureStr + " 시작");
		
		try {
			Object obj = joinpoint.proceed();  // 실행시 (클래스가 호출 된 시점)
			
			return obj;
			
		} finally {
			// System.currentTimeMillis() : 밀리세컨 단위의 시간
			System.out.println("실행 후 : " + System.currentTimeMillis());
			System.out.println(signatureStr + " 종료");
		}	
	}
}

 


7) bean.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:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

	
	<!-- AOP 객체생성 -->
	<bean id="logAop" class="com.aop.LogAop"/>
	
	<!-- AOP에 관한 어노테이션 사용하겠다 -->
	<aop:aspectj-autoproxy/>
	
	
	<bean id="myCat" class="com.dto.Cat">
		<!-- 객체에 값 넣기 -->
		<property name="name" value="야옹이"/>
		<property name="age" value="2"/>
		<property name="color" value="흰색"/>
	</bean>
</beans>

8) 코드를 실행할 MainClass를 생성한다.

 

MainClass 예시

package com.main;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

import com.dto.Cat;

public class MainClass {
	public static void main(String[] args) {
			
		// Java에서 xml을 실행 시
		// bean.xml을 읽어와라
		AbstractApplicationContext ctx = new GenericXmlApplicationContext("bean.xml");
		
		// xml에서 생선된 Object를 읽어 들인다.
		Cat myCat = ctx.getBean("myCat", Cat.class);
		
		myCat.info(); // info()메소드 호출
		System.out.println("=================================");
		myCat.setAge(1);
		System.out.println("=================================");
		myCat.info();
	}
}

 

실행화면

Cat.info() 시작
이름 : 야옹이
나이 : 2
컬러 : 흰색
실행 후 : 1626263390713
Cat.info() 종료
=================================
Cat.setAge(..) 시작
실행 후 : 1626263390713
Cat.setAge(..) 종료
=================================
Cat.info() 시작
이름 : 야옹이
나이 : 1
컬러 : 흰색
실행 후 : 1626263390713
Cat.info() 종료

Dynamic Web Project로 스프링 프로젝트 생성하기

 

 

Dynamic Web Project 생성한다.

 

Configure → Convert to Maven Project 생성한다.

 

pom.xml파일이 생성된다.

 

pom.xml에 Spring Web MVC 라이브러리 추가하기

https://mvnrepository.com/artifact/org.springframework/spring-webmvc/5.3.6

드래그 부분 복사해서 pom.xml의 <dependencies> tag안에 넣어준다.

위 코드를 넣으면 알아서 jar파일을 다운로드 해준다 (설정파일)

 

pom.xml 예시

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>sample01</groupId>
  <artifactId>sample01</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <release>16</release>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.3</version>
      </plugin>
    </plugins>
  </build>
  
  <dependencies>
  	<dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-webmvc</artifactId>
    	<version>5.3.6</version>
	</dependency>
  </dependencies>
  
</project>

 

WEB_INF 폴더를 추가한다.(spring, views)

 

dispatcherServlet.xml 생성하기

spring 폴더안에 Spring Bean Configuration File을 생성한다.

 

name 지정 후 Next> Beans와 context 체크한다.

 

dispatcherServlet.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:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

	<!-- spring MVC annotation(주석문, 지시문)을 사용하기 위한 설정 -->
	<context:annotation-config />
	
	<!-- bean 객체를 생성할 때 사용 
	 	 장점 : XML에서 바로 객체를 생성하면 singleton이 필요 없어진다.
		 사용자의 view의 위치, 확장자명 설정 -->
	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- property : class의 내부 변수  -->
		<!-- prefix : views의 경로 설정 -->
		<property name="prefix" value="/WEB-INF/views/"></property>
		<!-- suffix : 사용할 확장자 설정 -->
		<property name="suffix" value=".jsp"></property>
	</bean>
	
	<!-- base-package : 스프링에서 사용할 공통 패키지 설정 -->
	<context:component-scan base-package="bit.com.a"></context:component-scan>
	
</beans>

 

 

Web.xml 파일을 생성한다.

 

Web.xml 예시

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
  <display-name>sample01</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  	<servlet-name>dispatcherServlet</servlet-name>
  	<servlet-class>
  		<!-- 맨 처음 서블릿을 알려주는 코드 -->
  		org.springframework.web.servlet.DispatcherServlet
  	</servlet-class>
  	
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>
  			/WEB-INF/spring/dispatcherServlet.xml
  		</param-value>
  	</init-param>
  	
  	<!-- load-on-startup 1 : 제일 첫번째로 가야할 XML이다 설정, 여기부터 시작해라 -->
  	<load-on-startup>1</load-on-startup>
  	
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>dispatcherServlet</servlet-name>
  	<url-pattern>/</url-pattern>
  </servlet-mapping>
  
  <!-- 한글설정하기
  		jsp파일에서 setcharacterEncoding을 안해주어도 된다.
   -->
  <filter>
  	<filter-name>encodingFilter</filter-name>
  	<filter-class>
  		org.springframework.web.filter.CharacterEncodingFilter
  	</filter-class>
  	
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  	
  	<!-- forceEncoding : 강하게 설정 -->
  	<init-param>
  		<param-name>forceEncoding</param-name>
  		<param-value>true</param-value>
  	</init-param>
  		
  </filter>
  
  <filter-mapping>
  	<filter-name>encodingFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

 

java 예시

package bit.com.a;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller		// annotation
public class HelloController {
	
	@RequestMapping("hello")
	public String helloMethod() { // 컨드롤러에 왔니 ?
		System.out.println("HelloController helloMethod()");
		
		return "hello";		// hello.jsp로 가라!
	}
	
}

 

views폴더에 hello.jsp 파일을 생성한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>hello.jsp</h1>
</body>
</html>

 

webapp폴더에 index.jsp파일을 생성한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<a href="hello">hello로 이동</a>
</body>
</html>

 

실행화면

 

EL Tag(Expression Language) :  web 부분에서 java와 혼용하지 않기 위한 태그

형식 :  ${ 값, 연산식 }   

 

EL Tag와 Java 비교 사용 예시

<% // Java
   String str1 = "hello";
   request.setAttribute("_str", str1);
   String s = (String)request.getAttribute("_str");      /* 짐싸 */
%>
str1 = <%=s %>

<% // EL
   String str2 = "hi";
   request.setAttribute("_str", str2);
%>
str2 = ${ _str }

Java는 표현식(<%= %>)을 사용하여 value를 불러온다. (java는 getAttribute필요)

EL tag는 setAttribute에서 바로 value를 꺼내올 수 있다.

 

<%='값' %>
<br>
${ '값' }
<br>
${ 2 + 3 }

 

 

EL tag : empty 사용예시

<%
Object obj = new String("world");
if(obj != null) {
%>
   <p>obj는 null이 아닙니다</p>
<%
}
%>

<%
   request.setAttribute("world", obj);
%>
obj = ${ empty world }     <!-- false -->
<br>
obj = ${ not empty world } <!-- true -->

empty : boolean형 반환 obj가 비었니? 안비었니?

 

 

Java class 예시

package dto;

import java.io.Serializable;

public class MemberDto implements Serializable{

   private String message;
   
   public MemberDto() {
   }

   public String getMessage() {
      return message;
   }

   public void setMessage(String message) {
      this.message = message;
   }
   
}

 

 

<%
MemberDto dto = new MemberDto();
dto.setMessage("hello EL");

request.setAttribute("mem", dto);
%>

message:<%=dto.getMessage() %>
<br>
message:${ mem.message }

EL tag는 무조건 setAttribute를 거쳐야한다.

 

<%
	List<MemberDto> mlist = new ArrayList<>();

	MemberDto m = new MemberDto();
	m.setMessage("안녕");
	mlist.add(m);
	
	m = new MemberDto();
	m.setMessage("하이");
	mlist.add(m);
%>

<%=mlist.get(0).getMessage() %>
<br>

<%	
	request.setAttribute("mlist", mlist);
%>

${ mlist[1].message }
<br><br>
<input type="text" value="${ mlist[1].message }">
<p>${ mlist[1].message }</p>

 

배열 value 가져오는 예시

<%
   String array[] = { "hello", "world" };
   request.setAttribute("array", array);
%>

<%=array[0] %>
<br>
${ array[0] }
<br>
${ array[1] }

 

List value 가져오는 예시

<%
   List<String> list = new ArrayList<>();
   list.add("Tiger");
   list.add("Lion");
%>
<%=list.get(1) %>

<%
   request.setAttribute("mylist", list);
%>
<br>
${ mylist[1] }

Core Tag : 변수나 제어문을 사용할 수 있게 해주는 태그

 

Core Tag 사용시 jstl-1.2.jar, standard-1.1.2.jar파일이 있어야 한다.

 

 

 

Core Tag는 필히 page지시문에 jstl선언해주어야한다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

Core Tag와 Java 비교 사용예시

<%
   String data = "Core tag 입니다";
   request.setAttribute("_data", data); // 왼 : EL , 오: JAVA
%>

${ _data }      <!-- EL -->
<br>

<c:set var="_data" value="Core tag 입니다"/>
<!-- 위와 동일 -->
<c:out value="${ _data }"></c:out>
<br><br>

<!-- if -->
<%
	request.setAttribute("count", "10");
%>

<%
	String scount = (String)request.getAttribute("count");
	int count = Integer.parseInt(scount);
	if(count >= 10){
%>
	<p>count : <%=count %></p>
<%}%>


<!-- core tag는 자동으로 숫자로 해준다? -->
<c:if test="${count >= 10}">
	<p>count : <c:out value="${count}"></c:out>
	<p>count : ${count}</p>
</c:if>

<%
	request.setAttribute("name", "홍길동");
%>
<%
	String name = (String)request.getAttribute("name");
	if(name.equals("홍길동")){
%>
	<p>이름 : <%=name %></p>
<%} %>


<c:if test="${name == '홍길동' }">
<%-- <c:if test="${name eq '홍길동'}"> --%>
	<p>이름 : ${name}</p>
</c:if>


<!-- for -->
<%
	for(int i = 0; i < 10; i++){
%>
	<p><%=i %></p>
<%} %>

<!-- varStatus="i" : 밖으로 나가는 값 -->
<c:forEach begin="0" end="9" step="1" varStatus="i">
	<p>${i.index}</p>
</c:forEach>

<br><br>


<%
   List<MemberDto> list = new ArrayList<>();
   
   MemberDto dto = new MemberDto();
   dto.setMessage("hello");
   list.add(dto);
   
   dto = new MemberDto();
   dto.setMessage("world");
   list.add(dto);
   
   request.setAttribute("mylist", list);
%>
<%-- 데이터만 다 돌리고 싶을땐 :  var="mem" items="${mylist}" 이것만 있으면 된다. --%>
<c:forEach begin="0" end="1" var="mem" items="${mylist}" varStatus="i">
   <p>index:${i.index} data:${mem.message}</p>
</c:forEach>

 

c:set 변수의 선언
var 변수명
value 변수에 넣을 값
c:out 변수 출력
value 변수에 넣을 값
c:if 조건문 (if문)
test 조건 판별식
value 변수에 넣을 값
c:forEach 반복문 (for문)
begin 시작값
end 종료값
step 증감값
var 현재 아이템의 변수명
varStatus 반복상태의 값을 지닌 변수
items 반복데이터가 있는 아이템명

 

https://spring.io/tools 접속 후

 

 

Spring Tools 4 is the next generation of Spring tooling

Largely rebuilt from scratch, Spring Tools 4 provides world-class support for developing Spring-based enterprise applications, whether you prefer Eclipse, Visual Studio Code, or Theia IDE.

spring.io

 

운영체제 선택 후 파일을 다운로드한다. 

 

다운로드한 파일을 더블클릭하면 압축이 풀리면서 폴더(sts-4.11.0.RELEASE)가 생성된다.

알집 프로그램을 제거해야 압축이 풀린다.

 

혹시 알집 안깔았는데도 압축이 풀리지 않는다면

기본 앱 → 파일 형식별 기본 앱 선택 

 

Java(TM) Platform SE binary를 기본 앱으로 선택하여 준다.

그래도 안된다면.. 자바를 재설치 한다.

그래도 안된다면.. 압축이 풀린 폴더(sts-4.11.0.RELEASE)를 usb에 옮겨 이동시킨다.


sts-4.11.0.RELEASE를 사용할 위치에 잘라내기 하여 붙여넣기를 해준다.

폴더 안의 SpringToolSuite4.exe를 실행한다.

 

open perspective 설정을 해주어야 한다.

 

Marketplace → legacy 검색

 

Spring Tools 3 Add-On for Spring Tools 4 3.9.17.RELEASE를 Install 한다.

 

Install 완료한 다음 restart 후 open perspective를 클릭하면 Spring이 생겨난다.

Spring 선택 후 new project → Spring → Spring Legacy Project 클릭 후 Next> 클릭한다.

 

Project name 설정 후 Spring MVC Project 클릭 후 Next> 클릭한다.

 

패키지 설정을 해준다. (예 : bit.com.a) 설정 후 Finish 클릭한다.

 

이제 Web을 추가해야 한다. Help → Install new software 클릭

 

Work with : Latest Eclipse Release - https://download.eclipse.org/releases/latest 선택

 

 

아래 표시된 부분을 체크박스 클릭 후 Next> 클릭한다.

( legacy 다운 전에 web를 먼저 다운로드하면 legacy가 안 보이기 때문에 순서대로 진행한다. )

 

Install 완료한 다음 restart 후 Server를 연결한다.

new project → Web → Dynamic Web Project 클릭 후 Next> 클릭한다.

 

Project name 설정 후 Finish 클릭한다.

 

Project Explorer를 확인해보면 두 개의 프로젝트가 생성되어 있다.

 

Server가 잘 연결 되었는지 확인을 해보기 위해 Web project에서 test 할 jsp파일을 생성한다.

 

Run을 해서 실행이 잘 된다면 성공!

 

실행화면


이제 regasy를 실행해보자

 

 

HomeController.java 파일 open 후 value 부분을 "/home"으로 변경하여 준다.

 

webapp → index.jsp 생성한다. 

 

body태그 안에 <a href="home">home</a> 넣어준다.

실행화면

index.jsp가 views/home.jsp를 연결해 주어 위와 같은 실행화면을 보여주게 된다.

 

이런 방식으로 실행되는 것이 Spring 구조이다.

언제 어디서든 사용할 Connection class와 Close class 만들기

JDBC사용시 꼭 해주어야할 작업이 몇가지 있다.

바로 Java에서 db연결과 db닫기이다.

JDBC사용시 중복의 방지를 위해 해당class의 생성을 추천한다.

 

DBConnection class 예시

package db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnection {
	public static void initConnection() { 
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");	
			// 연결이 되면 해당 문구가 실행된다.
			System.out.println("Driver Loading Success");			
		} catch (ClassNotFoundException e) {			
			e.printStackTrace();
		}
	}

	public static Connection getConnection() {		
		Connection conn = null;		
		try {
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
			System.out.println("Oracle Connection Success!!");
		} catch (SQLException e) {
			System.out.println("DB를 연결하지 못했습니다");
		}
		return conn;		
	}
}

DBClose class 예시

package db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBClose {
	public static void close(Connection conn, PreparedStatement psmt, ResultSet rs) {
		try {
			if(conn != null) {
				conn.close();
			}
			if(psmt != null) {
				psmt.close();
			}
			if(rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

 

DB를 다 사용을 하면 DB의 과부화 방지를 위해 무조건 close 해주어야 한다.

Connection

DB 연결객체

PreparedStatement

Query문을 실행객체

ResultSet

결과 취득 객체

 

해당 class의 close메서드는 dao class에서 Qruery문 사용할 때마다 finally구절에 필히 작성한다.

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

[JDBC] Java로 DB에 데이터 추가하기  (0) 2021.06.16

+ Recent posts