PLOD

[spring] Spring dependency 설정(gradle, maven) 본문

개발 공부/Spring framework

[spring] Spring dependency 설정(gradle, maven)

훌룽이 2023. 7. 8. 10:45

현재 우리나라의 삼성 , 현대, LG 같은 대기업들과 네이버 , 라인, 카카오 같은 it 서비스 기업들 ,  수 많은 SI 기업들은 대부분 java 기반의 sping framework를 사용하고 있다. 당연히 개발자로 취업을 희망하는 사람들은 (나 같은..) spring이 시장 점유율이 높다는 이유로 사용하고 있다. 하지만 근본적으로 spring을 사용하는 이유는 뭘까?

 

프레임워크는 말그대로 '뼈대나 근간을 이루는 코드들의 묶음' 이라고 할 수 있다. 중요한 점은 이뼈대가 왜 필요한 지이다. 개발자는 각 개개인의 능력 차이가 큰 직종이고 그렇기 때문에 개발자 구성에 따라 프로젝트 결과 역시 큰 차이를 낳는다. 이러한 차이를 극복하기 위해 나온것이 framework이다. 프레임워크를 이용한다는 의미는 프로그램의 기본 흐름이나 구조를 정하고 모든 팀원이 이 구조에 자신의 코드를 추가하는 방식으로 개발하게 된다. 

 

프레임워크의 최대의 장점은 개발에 필요한 구조를 이미 코드로 만들어 놓았기 때문에 , 실력이 부족한 개발자라 하더라도 반 쯤 완성한 상태에서 필요한 부분을 조립하는 형태의 개발이 가능하다는 점이다. 프레임워크를 사용하면 일정한 품질이 보장되는 결과물을 얻을 수 있고 개발 시간을 단축할 수 있다.

 

2000년대 초반 부터 시작된 엔터프라이즈급의 개발은 안정된 품질의 개발이 절실 했고, 그 결과 많은 프레임워크의 전성시대라고 할 수 있었습니다. spring은 비교적 그 시작이 조금 늦은 프로젝트였지만 가장 성공적인 경량 프레임워크 이다.

spring의 대표적인 장점은 

 

1) 다른 프레임 워크들에 비해 덜 복답한 경량 프레임워크

2) 프로젝트의 전체 구조를 설계 할 때 유용한 프레임워크(OOP(객체지향프로그래밍) 구조)

3) 여러 종류의 프레임워크와 혼용 사용 가능

4) 개발 생산성과 개발도구의 지원

 

spring 의 주요 특징은

1) POJO(Plain Old Java Object)기반의 구성 

2) 의존성주입(DI)를 통한 객체 간의 관계 구성

3) AOP(Aspect-Oriented-Programming) 지

4) 편리한 MVC 구조

5) WAS의 종속적이지 않은 개발 환경

이 있다. 

 

spring을 사용하여 개발을 할 때는 MVC 모델을 사용하여 개발한다. MVC란 객체지향프로그래밍에서 MVC란 사용자 인터페이스를 성공적이며 효과적으로 데이터 모형에 관련 시키기 위한 방법론 또는 설계 방식 중 하나이다. MVC 패텅은 목적 코드의 재사용에 융용한 것은 물론, 사용자 인터페이스와 응용프로그램 개발에 소요된는 시간을 현저하게 줄여주는 형식이라고 많은 개발자들이 평가하고 있다.

Maven을 통한 spring MVC project 만들기

spring sts에서 spring MVC 기반으로 개발을 할 때는 [Spring Legacy Project]를 이용하여 spring 프로젝트를 만든다.

프로젝트는 다음과 같이 구성된다. 

spring 개발의 강력함은 의존성 주입을 할 때,  Annotation을 사용할 때 발휘 할 수 있다. gradle이나 maven을 통해 의존성을 주입 할 수 있다. 나는 spring으로 개발 할 때는 maven을 통해서 의존성을 주입하고, spring boot를 통해서 개발 할 때는 gradle을 사용한다.  의존성을 쉽게 주입 할 수 있다.  pom.xml의 코드의 각 태그마다 정보는 다음과 같다

<project> : Maven의 XML 네임스페이스를 지정
<modelVersion> : Maven의 model Version
<groupId> : 그룹 ID태그 
<artifactId> : 아티팩트ID 태그
 <version> : 버전명 태그
<packaging> 패키징 형식을 지정하는 태그
<name> : 프로젝트의 이름
<url> : Maven의 url
<properties> : 프로젝트 관련 속성
<parent> : pom.xml의 상속에 관련된 태그
<dependencies> : 프로젝트가 의존하는 라이브러리들의 정보
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.zerock</groupId>
	<artifactId>controller</artifactId>
	<name>ex00</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<java-version>11</java-version>
		<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
	<dependencies>				// dependency 추가(maven 사이트에서 찾아서 필요한 것들 추가)
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>

		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>
		<!-- Servlet -->
		<!-- <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> 
			<version>2.5</version> <scope>provided</scope> </dependency> -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.26</version>
			<scope>provided</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
		<dependency>
			<groupId>com.oracle.database.jdbc</groupId>
			<artifactId>ojdbc8</artifactId>
			<version>19.3.0.0</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
		<dependency>
			<groupId>com.zaxxer</groupId>
			<artifactId>HikariCP</artifactId>
			<version>2.7.4</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.6</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.3.2</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4.1 -->
		<dependency>
			<groupId>org.bgee.log4jdbc-log4j2</groupId>
			<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
			<version>1.16</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.9.6</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-xml -->
		<dependency>
			<groupId>com.fasterxml.jackson.dataformat</groupId>
			<artifactId>jackson-dataformat-xml</artifactId>
			<version>2.9.6</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
			<version>2.8.2</version>
		</dependency>
		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-eclipse-plugin</artifactId>
				<version>2.9</version>
				<configuration>
					<additionalProjectnatures>
						<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
					</additionalProjectnatures>
					<additionalBuildcommands>
						<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
					</additionalBuildcommands>
					<downloadSources>true</downloadSources>
					<downloadJavadocs>true</downloadJavadocs>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.5.1</version>
				<configuration>
					<source>11</source>
					<target>11</target>
					<compilerArgument>-Xlint:all</compilerArgument>
					<showWarnings>true</showWarnings>
					<showDeprecation>true</showDeprecation>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>exec-maven-plugin</artifactId>
				<version>1.2.1</version>
				<configuration>
					<mainClass>org.test.int1.Main</mainClass>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

이외에도 maven에 추가하고 싶은 의존성이 있다면 다음 사이트에서 찾아볼 수 있다.

Maven Repository: Search/Browse/Explore (mvnrepository.com)

* 프로그래밍에서 빌드(build) 란 ?

소스 코드 파일을 컴퓨터에서 실행할 수 있는 독립 소프트웨어 가공물로 변환하는 과정 또는 그에 대한 결과물

 

maven은 자바용 프로젝트 관리도구로  Apache Ant 의 대안으로 만들어졌다. Maven은 프로젝트의 전체적인 라이프 사이클을 관리하는 도구 이며,  많은 편리함과 이전이 있어 널리 사용되고 있다. Maven은 필요한 라이브러리를 특정문서에 정의해 놓으면 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데에 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해서 자동으로 다운받아 준다.

Gradle을 통한 spring MVC project 만들기

Gradle은 Groovy를 기반으로 한 빌드 도구이다 앞서 설명했던 Maven과 같은 전 세대 빌드 도구의 단점을 보완하고 장점을 취합하여 만든 오픈소스로 공개된 빌드도구이다. 기존의 Maven은 pom.xml로 작성되어 Dependency가 많아져 라이브러리가 많아질수록, 라이브러리가 서로 의존하는 경우 복잡해질수 있다는 단점이 있었다.  Gradle은 Java와 매우 비슷한 Groovy 언어 기반의 DSL을 사용하고 있다. 

이제부터는 spring sts가 아니라 intellij라는 프로그램을 사용하여 spring 프로젝트를 만들고 개발할 것이다. (요새 이게 Hot 함)Gradle을 사용하여 프로젝트를 만들기 위해서는 다음 사이트를 이용한다.

https://start.spring.io/

사이트에 들어간 후, spring initalizr을 통해 프로젝트를 만들어보자. 나는 project는 Groovy 기반의 Gradle을 사용할 것이다. 그리고 개발 언어는 Java로 할 것이고 Java 버전은 11버전을 사용할 것이다. spring (boot) 버전은 2.X.X 버전이면 다 괜찮다. Snapshot 버전(테스트 버전)만 아니면 된다.  packaging은 War로 설정해줄것이다. 또 Dependency는 Spring Web과 Lombok을 추가해주자

build.gradle 파일을 확인해서  다음과 같이 설정해주면 된다.

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.3.1'
	id 'io.spring.dependency-management' version '1.1.5'
}

group = 'com.sparta'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'mysql:mysql-connector-java:8.0.28'
	implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
	useJUnitPlatform()
}
maven : pom.xml을 통해 의존성 부여
gradle : build.gradle을 통해 의존성 부여

'개발 공부 > Spring framework' 카테고리의 다른 글

[Spring] JPA(Java Persistence API)  (0) 2024.07.03
[spring] spring 과 MyBatis 연동  (0) 2023.08.19
[spring] spring MVC - (3.View)  (0) 2023.04.17
[spring] spring MVC - (2.Controller)  (0) 2023.04.17
[spring] spring MVC- (1.Model)  (0) 2023.03.23
Comments