Initial Setting in Project

김동욱·2023년 6월 28일
0

Final Refactoring

목록 보기
3/3
post-thumbnail

이전까지는 프로젝트 내부의 파일의 내용을 변경함으로 설정을 하는 것이 아닌 Preference를 통해서 설정값을 잡는 것을 해보았다.


이번엔 실제로 프로젝트 내부의 내용 변경을 통해서 프로젝트의 시작 세팅을 해보자!

우선 설정을 위해서 조작해야하는 파일은
      1. pom.xml
      2. serlvet-context.xml
      3. root-context.xml

위 세가지가 우선적으로 사용이 된다.

🌟pom.xml

pom.xml은 Project Object Model의 약자로
아래와 같은 메이븐 도구의 설정값들을 설정하는 파일이라고 할수 있다

  1. 프로젝트의 정보
  2. maven이 사용할 상수 정보
  3. 의존성 라이브러리
  4. 빌드 정보
  5. 라이브러리를 다운받을 저장소 설정

빌드란..❓

개발자가 작성한 코드와 라이브러리의 코드를 결합하여 JVM이 실행 시킬수 있도록 완성하는 작업

개발자가 실제 코드를 작성하면 작성된 코드를 컴파일러가 컴파일하여 바이트 코드로 변경해주는데 코드를 작성할때는 API같은 것들이 포함되어서 컴파일 된다고 생각할수 있는데
사실은 컴파일 하고 바이트 코드가 되고 나서도 그 파일에는 라이브러리들이 포함되어 있지 않음..
컴파일 시에는 문법상 문제점이 존재 하는지 안하는지를 확인하는 것 뿐이며
실제로 프로젝트에 jre, server runtime, 라이브러리 등이 추가되는 시점은 [Build] 하는 시점임( 바이트코드로 만들어지고 나서 빌드하려고 할때 라이브러리를 가져와서 합쳐준 다음에 실행을 하게 되는 것임, 이렇게 가져오기위해 어디에 라이브러리가 있는지 관리하고 보관하는 것임 )

그래서 우리는 이 pom.xml에 초기세팅을 필요로 한다

가장 초기에 할 setting은 Java의 버전과 Spring의 버전 확인 및 변경이다

1. Java Version Setting

Java를 이전 포스팅에서 세팅할때 처음에 1.6버전으로 되어 있던것을 기억할 것이다.
pom.xml에도 legacy로 생성되면서 설정되어 있던 java의 버전을 그대로 가지고 있게 된다. 그 부분은 아래 밑줄친 부분이다.

아까 상단에서 말했던 pom.xml의 기능중 하나인 [maven이 사용할 상수 정보]에 관한 기능을 수행하는 부분이다.

Java의 버전이 기존에 1.6이였고 프로젝트에서 Java의 버전은 수시로 변경되지 않는다
그렇기 때문에 <properties>라는 태그 내부에 <java-version>1.6</java-version>과 같이 넣어줌으로써 이후 태그 사이에서 ${java-version}과 같이 사용하면 java-version태그 내부에 있는 숫자를 지칭하는 상수가 된다.

이렇게 설정함으로써 java의 버전과 동일한 버전을 사용하는 라이브러리의 버전 정보에 ${java-version}를 넣어주면 java의 버전이 변경될 경우엔 모든 것을 바꿔줘야 하는 것이 아니라 <java-version>태그 내부의 숫자만 변경시켜주면 되는 편리한 기능인 것이다!!

그러니까 이젠 우리가 사용하는 자바 버전인 11으로 변경해주자.

그리고 Apache Maven Compiler Plugin은 Java의 버전을 명시하지 않는 경우 기본으로 설정된 version으로 java를 인식하고 컴파일을 하게 되는데 자바의 버전이 올라가면서 추가되는 문법을 인식하지 못하고 컴파일 에러를 발생할수도 있기에 자바 버전에 맞게 설정을 해줘야한다

그게 Apache Maven Compiler Plugin의 <source>와 <target>부분이다.

보면 기본적으로 기존에 설정되었던 1.6 버전으로 설정되어 있는 것을 볼수 있다.
이 부분을 우리가 사용할 자바버전인 11으로 변경하면 되는데 위에 작성한것 처럼
${java-version}을 사용해서 넣어주자!

**왠만하면 <java-version>태그 내부의 글자를 복사해서 넣기로 하자.. 오타가 나면 문제가 발생하기 때문...;

2. Spring Framework Version Setting

스프링의 버전을 변경하면 스프링과 관련된 의존성을 가진 dependency들 모두 버전이 변경되게 되어 있다.

아래를 보면 <org.springframework-version> 태그 내부에 들어 있는 버전과 모든 Spring Framework 라이브러리의 버전이 동일한것을 볼수 있다.

따라서 <org.springframework-version>내부에 Spring Framwork의 버전을 변경하면 모든 Spring Framework 라이브러리의 버전이 변경된다는 것임

🤨그러면 어떤 스프링 프레임 워크의 버전을 사용해야 하는가?

https://spring.io/projects/spring-framework#overview
스프링의 웹사이트에서 상단 탭에 있는 [Project] -> [Spring Framework] -> [Support]를 눌러보면

와 같은 화면을 볼수 있는데 여기서 아래 설명부분을 번역해보면


라고 되어 있는데 위 그래프에 막대 색상이 어떤 의미를 가지는지를 설명해주고 있다.

[초록색 막대 == OSS support]

의 경우는 현재 적극 적으로 지원중인것으로 안정화가 되어 가는 버전을 의미하고 있다고 생각되고

[상아색 막대 == Commercial support]

의 경우는 안정화가 되었으나 언제 종료될지 모르는...? 것으로 생각되고

[하늘색 막대 == Future release]

의 경우는 미출시 되었으나 곧 출시를 앞두고 있는 버전을 의미하는 것으로 생각 된다

현재 시간인 23년 7월 3일 시점에 적절하게 최적화가 어느정도 진행 되어 있는 상태이며 서비스의 종료까지 시간이 넉넉하게 남아 있는 스프링 프레임 워크의 버전을 선택해야 하는데
[6.0.x ]버전의 경우는 출시가 된지 몆달이 지나지 않은 시점으로 최적화에 대한 의문점이 들며 버그나 오류가 발생할 위험성이 높아 적절하지 않고,
[5.2.x ]버전의 경우는 출시된지 오래 되어 최적화에 의심이 되진 않으나 서비스가 된지 오래되어 종료 시점이 얼마 남지 않은 상태이기에 적절하지 않아보이고

현재로서 [5.3.x ] 버전이 가장 적절한 버전으로 보인다

나는 기존에 국비에서 사용했던 Spring Framework Vesion인 5.3.27버전을 사용하려고 한다. (사실 5.3.x 버전을 사용해야 한다는 것은 알겠으나 버전인 x에 대한 버전은 어떻게 선택해야 할지 잘 모르겠다, 그래서 일단 기존에 사용하던 버전인 27을 써야겠다... 만약 팀이 어떤 프로젝트를 할 경우에 어떤 버전을 사용하라고 공지를 해줄것 이라고 생각이 된다...세부 버전들이 큰 차이점을 갖는 것이 아니라면 공통되게만 하면 되는 것 아닐까 하는 생각을 가지고 있다..)


버전을 변경하고 저장을 해보면...


버전들이 모두 변경된것을 볼수 있다

3. 불필요한 세팅값 주석

Maven Dependencies를 보면 [servlet-api-2.5.jar]과 [jsp-api-2.1.jar]가
추가되어 있는 것을 볼수 있는데 이는 pom.xml의 내부에 해당 라이브러리에 대한 dependency가 추가되어 있기 때문인데 아래 사진을 보면 그 버전에 맞는 dependency태그가 추가되어 있는 것을 볼수 있다.

그런데 Server Runtime을 보면 여기도 servlet과 jsp라이브러리가 이미 존재하는것을 볼수 있다...그렇기에 그냥둬도 괜찮다고 들었으나 혹시 모를 충돌을 막기위해 maven dependency에 있는 servlet과 jsp를 삭제(혹은 주석)하도록 하자..
(server Runtime에 존재하는 Servlet과 jsp는 Server의 버전을 따라가기에 Maven에 있는 것보다 훨씬 버전이 높음...)

주석처리를 하게 되면 Maven Dependencise에 servlet과 jsp api는 삭제되고 Server Runtime에만 존재하는것을 볼수 있다.

여기까지가 repository 홈페이지에 접속하기 전 설정방법이고 이제부터는 mvn repository를 사용한 dependency의 추가가 이루어진다.

Mvn Repository를 사용할것인데 우선 Mvn Repository(https://mvnrepository.com/)에 접속해서 원하는 라이브러리를 검색하여 라이브러리를 추가할수 있는데 라이브러리를 추가하기 전에 우리가 아까 Spring Framework의 세팅을 하면서 버전을 바꾸는데 하나를 바꿨더니 Spring이라고 적혀있는 많은것들이 바뀌었던 이유를 확인해보려고 한다.

MVN Repository에 접속하면 아래와 같은 페이지가 보이며 라이브러리를 검색할수 있다.

Spring을 검색해서

Spring관련된 라이브러리인 Spring Context로 들어가보면
Spring Context의 버전들을 확인할수 있고

버전 번호를 클릭해보면 (내가 받은 스프링의 버전인 5.3.27 버전을 들어갔다)
아래와 같은 화면이 보이고

그 중에 Maven이라고 되어 있는 부분이 우리가 pom.xml 추가하는 dependency가 된다.

그 아래쪽을 확인해보면
Compile Dependencies(4)라고 되어 있는 부분이 있는데 이는 메이븐 저장소에 반드시 의존성을 가지고 있어서 필요한 라이브러리를 등록해뒀는데 이를 받으면 Compile Dependencies에 있는 라이브러리가 모두 같이 받아진다는 것임...

근데 보면 Compile Dependencies에는 4개만 존재하는데 그럼 추가된 것은 왜 8개인가..?
그 이유는 Srping-context Dependency가 추가되면서 Compile Dependencies인 Spring Core에 Compile Dependencies인 Spring-jcl이 포함되며 Sring-webmvc Dependency도 추가 되어 있기 때문임

MVN Repository에서 Spring-webmvc를 검색해서 Compile Dependencies를 확인해보면

추가되는 것들을 볼수 있다..!


4. MyBatis Dependency

MyBatis를 위해 추가해야할 Dependency는 [mybatis], [mybatis spring], [spring-jdbc], [OJDBC6]이다.

이 라이브러리들도 서로의 버전이 너무 크게 차이가 난다면 오류를 발생시킬수 있다..
무조건 최신이 좋은것은 아니라는 것은 이미 알고 있으나 그러면 얼마나 최신이여야 하는가..?

MyBatis-Spring(https://mybatis.org/spring/ko/index.html) 홈페이지를 들어가보면 [필요조건]이라는 항목이 있는 데 이는 각 버전마다의 상한선을 작성해둔 쉽게 면 최소, 최대 스팩에 대한 내용이다.

보면 MyBais-Spring중 3.0 version의 경우는 MyBatis의 버전이 적어도 3.5이상부터 가능하고 Spring Framework의 version이 적어도 6.0이상은 되어야 한다, 또한 Java의 경우는 17version이상이 되어야 한다고 적혀 있다.

그렇다면 우린 Spring Framework의 버전도 5.x.x버전이기도 하고 Java또한 11버전이기에 이를 사용하기엔 너무 높은 버전의 MyBaits-Spring인 것임...

그러면 MyBais-Spring중 2.1 version의 경우는 어떠한가?
MyBatis의 버전이 3.5이상이여야 하는것(동일), Spring Framework의 버전은 5.x.x 버전 이상이여야함(적절), Java의 버전은 8버전 이상이여야함(적절)

그러니까 우린 MyBatis-Spring버전은 2.1버전 이상 3.0버전 이하의 버전을 사용해야하고, MyBatis는 3.5이상의 버전을 사용하여야 Spring Framework와 Java 버전에 맞게 사용할수 있는 것이다.

그러면 적절한 버전의 라이브러리를 한번 다운받아보자.

4-1. MyBatis Dependency

Vulnerabilities는 취약성에 대한 내용으로 취약성이 존재하지 않는 버전으로 받아보자. 기존에 사용했던 버전은 3.5.12이기 때문에 그대로 받아보자

버전을 눌러들어가서

마우스로 안의 글자를 선택하면 전체 선택이 된다.
복사해서 pom.xml에 추가하면 라이브러리로 추가된다.

가장 상단 부터 추가되는 라이브러리에 대한 dependency를 추가하겠다.
영역을 주석으로 나누어 내가 추가한 dependency라는 것을 표현하여 가시성을 높였다.

물론 <dependencies>의 내부에 <dependency>가 추가되어야 한다..!

4-2. MyBatis-Spring Dependency

아까 확인 했던것 처럼 MyBatis-Spring은 2.1.x버전을 받아줘야한다.
그렇기에 그냥 2.1.x 버전중 그냥 2.1.0을 받으려고 한다.

해당 버전을 pom.xml에 추가한다.

🥲Spring-JDBC,OJDBC는 MyBatis와 연계되기보다는 DB와 연결되는 부분
스프링이 DataBase와 연결하려면 마이바티스를 쓰고 Java는 DB와 연계하려면 jdbc를 쓰면서 연결되는데 스프링과 jdbc와 연계가 되지 않더라도 연계되는 것처럼 사용해야 하기에 spring-jdbc 라이브러리가 필요함...
스프링에서 JDBC를 사용할 수 있도록 제공되는 라이브러리가 Spring-JDBC이다.

4-3. Spring-JDBC Dependency

JDBC는 스프링에서 JDBC를 연결할수 있게 만들어 뒀기에 스프링 버전을 따라간다
스프링 버전과 spring - JDBC버전이 동일 한것을 볼수 있음

우리가 사용하는 스프링은 5.3.27이기에 spring - JDBC 도 5.3.27을 써보자.

여기에 상수화 했던 변수를 추가해보자

4-4. OJDBC Dependency

OJDBC는 MVN Repository에 존재하나 적절한 버전이 없는듯 보임....그렇기에 저장소를 하나 더 추가하여 Oracle의 버전(Oracle XE 11g)에 맞는 OJDBC인 OJDBC 6버전의 dependency를 가져오려고 함.

😮Maven Repository의 추가

추가하려고 하는 Repository의 url은 http://maven.jahia.org/maven2 으로
예전에 사용하던 Repository라고 함.

https://maven.jahia.org/maven2에 접속해보면 아래와 같은 페이지가 보이고

여기서 아래와 같은 순서로 접속하면 OJDBC 6 버전을 받을수 있는것을 볼수 있는데

우리는 메이븐 저장소를 이용할것이기에 dependency를 작성해서 라이브러리를 추가하는 방법을 사용 할것이다.

먼저, OJDBC를 가지고 있는 메이븐 저장소를 Respository로 추가한다

아래의 코드를 <properties>닫는 태그아래 <dependencies> 시작 태그 위 그 사이에 작성해야한다.

<repositories> <!-- 저장소를 추가하기 위한 최상위 태그 -->
		<repository><!-- 저장소를 추가하기 위한 태그 -->
			<id>oracle</id>
			<url>http://maven.jahia.org/maven2</url>
		</repository>
 </repositories>


메이븐 저장소가 추가 되었고 해당 메이븐 저장소에 있는 라이브러리를 dependency의 형태로 추가할수 있게 되었다.

OJDBC의 추가는 기본적으로 dependency의 형태는

  <dependency>
    <groupId>라이브러리들을 서로 구분하기 위한 값(주로 포함된 패키지)</groupId>
    <artifactId>라이브러리 파일 이름</artifactId>
    <version>라이브러리의 버전</version>
  </dependency>

의 형태를 띄고 있고

저장소의 상단에 있는 루트를 보면 아래와 같이 구분 될수 있다.

그래서 OJDBC6의 Dependency는

 <dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>12.1.0.2</version>
 </dependency>

와 같이 추가해주면 된다.

이후 저장하면.. 모든 라이브러리가 Maven에 추가된것을 볼수 있다.

프로젝트를 만들면서 추가되는 Dependency는 추가될때마다 등록하고 초기 세팅으로는 여기까지..!

🌟 root-context.xml

MyBatis를 Maven을 이용해서 받았다면 그에 대한 설정값은 root-context.xml에서 설정해줘야한다.

DB와 연결을 하려면 DB에 접근하기 위한 설정값들을 DB에 적용시켜줄수 있어야 한다. 이런 값들을 작성하는 곳이 root-context.xml이다.

  1. Orcale Driver설정 bean으로 등록
  • org.springframework.jdbc.datasource.DriverManagerDataSource
  1. SqlSession을 만들기 위한 설정을 추가하는 SqlSessionFactory를 bean으로 등록
  • org.mybatis.spring.SqlSessionFactoryBean
    (SqlSessionFactory는 SqlSession 인스턴스를 생성할수 있음
    SqlSession은 데이터베이스의 SQL명령어를 실행하기 위한 모든 메소드를 가지고 있음
    SqlSession인스턴스를 통해 직접 SQL구문을 실행할수 있다.)

  1. Mapper찾는 클래스를 bean으로 등록
  • org.mybatis.spring.mapper.MapperScannerConfigurer

에 대한 설정값을 추가해줘야한다.

1. Spring이 DB에 접속하기 위한 DB접속 정보를 넣기 위한 Orcale Driver bean으로 등록 및 설정 추가

  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<property name="driverClassName" value="driver 클래스 이름"/>
    <property name="url" value="URL"/>
    <property name="username" value="DB 사용자 이름"/>
    <property name="패스워드(벨로그 특성상 p-가 있으면 비공개로 전환되어버려 한글로 작성..)" value="DB 비밀번호"/>
  </bean>

위의 태그들은 DB연결 설정을 XML을 통해서 스프링이 인식할수 있도록 태그 형태로 만들어져 있는 것임(Spring-jdbc 라이브러리를 사용하는 것임)

해당 클래스에 들어가보면

String url, String username, String 비빌번호 를 그냥 사용하는 것을 볼수 있는데 이는 부모클래스에서 멤버필드를 상속하기 때문임

그렇다면 상속되는 클래스인 AbstractDriverBasedDataSource를 보면

멤버 필드로 url과 username과 비밀번호 가 존재하는 것을 볼수 있다.

또한 값을 넣는 method(setter&getter등등..) 또한 상속 받고 있으며 set해주는것이 아래 부분인 것임

  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	//setDriverClassName을 호출하는데 그 매개변수는 value에 들어있는 값이다
    <property name="driverClassName" value="driver 클래스 이름"/>
    //(==setDriverClassName("driver 클래스 이름"))
    
    //setUrl을 호출하는데 그 매개변수는 value에 들어있는 값이다
    <property name="url" value="URL"/>
    //(==setUrl("URL"))
    
    //setUsername을 호출하는데 그 매개변수는 value에 들어있는 값이다
    <property name="username" value="DB 사용자 이름"/>
    //(==setUsername("DB 사용자 이름"))
    
    //setUsername을 호출하는데 그 매개변수는 value에 들어있는 값이다
    <property name="비밀번호" value="DB 비밀번호"/>
    //(==set비밀번호("DB 비밀번호"))
    
  </bean>

여기서는 setter를 호출한다고 보면 된다.

이렇게 DB의 설정값을 넣는 Orcale Driver설정이 끝났다.

2. SqlSession을 만들기 위한 설정을 추가하는 SqlSessionFactory를 bean으로 등록

  <bean id="SqlSessionFatory" class="org.mybatis.spring.SqlSessionFactoryBean">
	//mybatis에 대한 설정들을 추가할수 있다.
    
    //1. mybatis-config.xml의 위치 설정(알린다)
    //2. mybatis-config.xml없이 mybatis 설정 추가
    //3. mapper의 위치 설정(알린다)
    //..

    // 가장 먼저 DB에 접근 하기 위해 설정값을 추가하는 dataSource를 set해준다
    <property name="dataSource" ref="dataSource">
    //org.mybatis.spring.SqlSessionFactoryBean안에 있는
    <!--dataSource맴버필드에 값을 저장하는데 그 값의 ref(reference:출처는) 위에 
     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
     로 추가 했던 dataSource를 의미함-->
    //setDataSource(dataSource)와 동일하다
      
    //mapper의 위치를 설정해야 DB에 접속할수 있기에 mapper의 위치를 알려주는
    //mapperLocation은 필수...!
      
    //그외의 설정은 추가적인 작업으로 보아도 무방함..!
      
    //mapperLocation추가
    <property name="mapperLocaton">
      	<array> //매퍼의 위치를 배열로 설정이 가능함
           <value>classpath: 매퍼의 위치값 </value>
          //매퍼 위치값에는 *과 **을 사용할수 있으며 그 사이는 /으로 분리할수 있다.
          <!-- <value>classpath:/**/dao/**/*Mapper.xml</value>
		       dao 앞에 뭐가 오든  dao와 ~~Mapper.xml의 중간에 뭐가오든 
			   ~~Mapper.xml이란 파일이 마지막에 존재한다면 모두 
			   매퍼로 지정할 것이다 라는것..! 
				
				*는 한 단계아래에 어떤 이름이던
				**는 몆 단계든 상관없이 + 어떤 이름이던 
 		  -->
        </array>
    </property>
  </bean>

***mapperLocation을 <array>태그로 감싸는 이유는 맴버 필드인 mapperLocation의 형태로 존재하기 때문임

//추후 추가 수정 예정...

profile
땅에 떨어진 밥 한톨도 주워 먹으면서 성장하자

0개의 댓글