메이븐 프로젝트 생성하기

binary_j·2022년 1월 13일
0

스프링 프로젝트 시작하기


프로젝트 진행과정 요약
1. 메이븐 프로젝트 생성(or 그레이들)
2. 이클립스에서 메이븐 프로젝트 임포트
3. 스프링에 맞는 자바 코드와 설정 파일 작성
4. 실행

프로젝트 폴더 생성


메이븐 프로젝트 생성


모든 메이븐 프로젝트는 프로젝트 루트 폴더에 pom.xml 존재
pom.xml의 역할: 메이븐 프로젝트에 대한 설정 정보를 저장, 의존 모듈/플러그인 등의 설정을 저장하고 있음
pom.xml 작성

기본 설명


dependency: 의존 설정. 메이븐에서는 한 개의 모듈을 아티팩트라는 단위로 관리함. 각 아티팩트의 완전한 이름은 "아티팩트 이름-버전.jar" 형태. 의존성 주입은 실행 시 클래스 패스에 이 파일을 추가한다는 의미

리포지토리: 당연한 얘기지만 클래스 패스에 jar 파일을 추가하려면 이 파일을 어딘가에서 가져와야 함. 이 때 두 가지 방식이 있음
1. 메이븐 로컬 리포지토리: 여기의 그룹ID\아티팩트ID\버전 경로에 아티팩트ID-버전.jar파일이 있는지 확인
2. 메이븐 원격 중앙 리포지토리: 로컬에 파일이 존재하지 않을 경우 여기서 해당 파일을 다운로드함

메이븐 기본 로컬 리포지토리 경로: 사용자홈폴더.m2\repository

앞서 만든 프로젝트 폴더에서 mvn compile을 해 보면 pom.xml의 dependency에 있는 아티팩트가 다운로드 되는 것을 확인할 수 있다.
현재 로컬 폴더는 비어있기 때문에, 원격 중앙 레모지토리에서 파일이 다운로드 되는 것이다.

한번 다운로드 한 이후에는 컴파일 해도 다시 다운로드 되지 않는다.

의존 전이: 어떤 아티팩트가 다른 아티팩트에 의존한다면 그 아티팩트도 다운로드, 그 아티팩트가 또 다른 아티팩트에 의존한다면 그 아티팩트도 다운로드 ... 반복

메이븐 기본 폴더 구조
-src/main/java: 자바 소스코드 위치
-src/main/resources: 자바 소스 이외의 다른 자원 파일
-src/main/webapp: 웹 어플리케이션 기준 폴더

메이븐 프로젝트 임포트


이클립스 파일->import->Maven->Existing maven project

예제 코드 작성


간단한 세 가지 예제 코드를 작성할 것이다.
1. Greeter.java: 콘솔에 간단한 메시지를 출력하는 자바 클래스
2. AppContext.java: 스프링 설정 파일
3. Main.java: main() 메서드를 통해 스프링과 Greeter를 실행하는 자바 클래스




스프링 어노테이션에 대해 간단하게 설명해보자면
@Configuration: 스프링 설정 클래스
@Bean: 스프링 객체
이다.
메서드 위에 @Bean을 붙이면 그 메서드가 생성한 객체는 스프링이 관리하는 Bean 객체가 된다.

AnnotationConfigApplicationContext는 자바 설정에서 정보를 읽어와 Bean 객체를 생성/관리하는 역할
이 객체에서 AppContext의 @Bean 설정 정보를 읽어와 Greeter 객체를 생성/초기화한다.
getBean메서드는 Bean객체를 검색하는 역할을 한다. 두 파라미터는
(Bean객체명, Bean 객체 타입) 이다.

Cf) AnnotationConfigApplicationContext 외에도 XML, 그루비 코드로 객체 설정 정보를 가져올 수도 있다.
이 때는 GenericXmlApplicationContext 또는 GenericGroovyApplicationContext를 import 해야한다.

Cf2) 만약 위에서 작성한 greeter 메서드로 main()메서드에서 두 개의 객체 greeter1과 greeter2를 생성하면 두 객체는 같은 객체일까 서로 다른 객체일까?
결론부터 말하자면 둘은 같은 객체이다. 따로 설정을 해주지 않는 이상 같은 @Bean 메서드로 생성한 객체들은 모두 같은 객체가 된다. 이 때 이 Bean 객체들은 싱글톤 범위를 갖는다고 말한다.
만약 서로 다른 객체가 생성되게 하고싶다면,

@Bean
public Greeter greeter1(){
    ...
}

@Bean
public Greeter greeter2(){
    ...
}

다음과 같이 설정한 후 각각에 해당하는 객체를 생성해야 한다.

0개의 댓글