티스토리 뷰

사실 저는 게시판 프로젝트를 혼자 진행한 바 있습니다. https://github.com/kimjongbuem/bbs-jong

 

GitHub - kimjongbuem/bbs-jong

Contribute to kimjongbuem/bbs-jong development by creating an account on GitHub.

github.com

 

하지만 더욱 자세히 XML에 대해 이해하고자 책을 읽으며 글을 적게 되었습니다.

 

그렇다면 시작해볼까요?

 

 

Java Spring Lagacy Project -MVC를 선택하면,

 

HomeController

 

@Controller는 제쳐두고 @RequestMapping에 집중하도록 합시다.

 

 

@RequestMapping은 API 문서에서 이렇게 정의하고 있습니다.

 

Annotation for mapping web requests onto methods in request-handling classes with flexible method signatures. 

 

직역: 유동적인 메서드 시그니처와 함께 요청 핸들러 클래스에 정의된 메서드를 통해 웹 요청을 맵핑하는 어노테이션.

 

여기선 @Controller가 붙은 클래스에 정의된 home 메서드는 localhost:8080/mvc/ (기본 경로) 에 들어가는 순간 호출되게 됩니다. /mvc는 컨텍스트 주소이며 수정 가능합니다.

 

그럼 프로젝트 구성을 위해 각종 단계를 수립하겠습니다!!

 

1) 간단한 프로젝트를 위해 MavenRepository라는 사이트에서 인메모리인 DB HSQL의 디펜던시를 pom.xml에 추가!!

2) 하지만 데이터베이스만 있고 테이블과 데이터가 없으면 무용지물이니 스키마와 데이터 파일 XML을 넣습니다.

3) VO와 MyBatis를 이용한 DAO를 구성합니다. 여기서 mybatis-spring, mybatis, spring-orm 디펜던시를 추가!!

4) 마이바티스 규칙 정의 XML 파일과 마이바티스를 통해데이터에 접근할 쿼리문 XML을 만듭니다.

5) DAO를 인터페이스 정의하고 쿼리문의 id 값과 일치하는 메서드명을 만듭니다.

6) DAO interface를 구현받는 클래스를 만들어 직접 매핑할 Mapper클래스를 만듭니다.( 여기서는 맵퍼라는 개념이 딱히 나오진 않습니다만..)

7) 서비스구현을 하는데 이또한 interface로 구현한다음 상속을받는 Impl 클래스를 만들어 속성에 DAO 객체를 넣어 같은 함수이름으로 매칭시킵니다.

 

 

7단계로 나눴는데 천천히 파헤치도록 하겠습니다. 그리고 순서는 달라도 상관 없지만 최소한 MVC 순서대로 설명드리겠습니다!

 

 

 

마이바티스

 

마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해준다. 마이바티스는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있다고 문서에 나옵니다. 

 

즉 쿼리문에 저희가 원하는 무언가를 대입을 코드를 통해 가능하다는 것이죠.

 

 

그전에 첫화면이 구동되는 순서를 알아보겠습니다.(중요해요!!)

 

1) Tomcat의 server.xml

 

server.xml은 메인 설정 파일이고 톰캣 startup 초기 설정을 명세하는 책임이 있습니다. 

여기를 살펴보면,

접속주소는 localhost:8080/mvc/ 입니다.

 

context 태그를 확인해보면 path= /mvc 이다. 어 ?  위의 로컬 주소와 컨텍스트 주소가 일치하는 것을 볼 수 있습니다. 이 곳을 수정해서 주소를 바꾸는 것또한 가능합니다. 그럼? Connector의 port=8080 역시? 네.  포트또한 수정이 가능하죠.

 

이렇게 실행이되면 /mvc로 이동해 또다른 무언가를 찾기 시작합니다 바로 그것은!!

 

 

2) Tomcat의 context.xml

 

Context 설정은 톰캣에서 구동되는 하나의 웹 어플리케이션 자체의 설정을 의미합니다.

 

 

WatchedResource 태그는 이 위치로 있는 곳으로 가라! 확인 해보면 WEB-INF/web.xml로 가도록 지시합니다.

그럼 계속 가볼까요?

 

 

3) Tomcat의 web.xml

 

 

환영하는 파일 리스트들 index.html, htm, jsp 확장자가 붙어있는 파일을 찾아 이동해라라는 메세지입니다.

 

 

문제는 이 프로젝트에는 아직 이러한 파일들이 없습니다.

다른 프로젝트의 index.jsp

jsp:forward로 Controller에 직접 요청을 하지만 현 프로젝트에는 구성이 되어있지 않습니다. 만약 이러한 코드가 있다면 loginFirst.do라는 value를 가진 Controller 클래스의 RequestMapping를 받는 메서드가 실행됩니다.

그렇게 localhost:8080 주소만 눌러도 자동적으로 첫 페이지가 뜨는 것이죠!!

 

 

이런 식으로 프로젝트가 구동되며 실질적으로 현재 index 파일이 없기에 localhost:8080/mvc/ 이런식으로 직접 접근한 식입니다.

 

 

-----------------------------------------------------------------------------------------------------------------------------------

 

 

그럼 전에 말한 7단계를 나누며 설명드리겠습니다.

 

1, 3) 간단한 프로젝트를 위해 MavenRepository라는 사이트에서 인메모리인 DB HSQL의 디펜던시를 pom.xml에 추가!!

 

<!-- ORM -->

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework-version}</version>
</dependency>

<!-- HSQL -->
<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <version>2.3.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
    <scope>provided</scope>
</dependency>


<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.2.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.2.8</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>

 

밑에 단계에 추가할 디펜던시도 한번에 적었습니다. 우리는 이런식으로 의존 라이브러리를 한곳에 모아 기술하기 위한 것이죠. 이름에서도 나오듯이 DI (의존성 주입) 입니다!!

BoardVO 클래스

 

lombok을 통한 getter, setter, 생성자 어노테이션을 넣고 @Alias는 mybatis에서 지원하는 어노테이션으로 TypeAlias, 즉 별칭을 지정할 때 사용합니다.

 

https://gaeggu.tistory.com/6

 

[mybatis] @Alias 어노테이션에 대해

@Alias는 mybatis에서 지원하는 어노테이션으로 TypeAlias, 즉 별칭을 지정할 때 사용합니다. 이 어노테이션을 사용하기 위해서는 sessionFactory 설정 부분에 다음 코드를 추가해야합니다. sessionFactory.setTy

gaeggu.tistory.com

 

 

2) 하지만 데이터베이스만 있고 테이블과 데이터가 없으면 무용지물이니 스키마와 데이터 파일 XML을 넣습니다.

 

실제 HSQL에 들어갈 테이블과 데이터를 넣는 과정입니다. 이게 어떻게 실행되는지는 이따가 알아보겠습니다.

 

BOARD table

 

Data 저장

 

4) 마이바티스 규칙 정의 XML 파일과 마이바티스를 통해데이터에 접근할 쿼리문 XML을 만듭니다.(중요!!***)

 

여기가 핵심입니다. 마이바티스 파일을 어떻게 구성할 것이며 어떤 경로로 가져올 것이고 모든 것을 정하는 부분입니다.

 

web.xml

여기서 root-context.xml이란 파일이름이 보일 것입니다. 컨텍스트 설정 파일 위치라고 파라미터이름에 적혀있군요.

 

root-context.xml

 

beans에서 xmlns 설정을 통해 jdbc:embedded-database 태그를 갖고옵니다. 딱 뜻만 보더라도 jdbc 인터페이스 내장 데이터베이스 이며 type은 아까 설정한 HSQL입니다. 또 아까 작성한 테이블과 데이터 sql도 보이는 것도 확인 가능합니다. 이뜻은 내장하는 것과 동시에 실행시키겠다는 소리입니다!!

 

그리고 또다른 bean에 SqlSessionFactoryBean이 보이는군요. 이 클래스는 SqlSession을 상속받는데 API 문서에서 보면,

 

SqlSession : The primary Java interface for working with MyBatis. Through this interface you can execute commands, get mappers and manage transactions.

 

마이바티스를 이용하기위한 주요한 자바 인터페이스. 우리는 이 인터페이스를 이용해 명령, 맵퍼, 심지어 트랜잭션을 관리할 수 있게됩니다. 그것을 상속받는 클래스또한 같은 역할을 수행하게 되죠.

 

그리고 SqlSessionFactoryBean은 3개의 프로퍼티를 갖는데,

 

1. dataSource는 우리가 적용할 데이터베이스. (실제로 위에 적음)

 

2. configLocation은 설정파일입니다.

 

마이바티스 규칙정의 

typeAliases는 긴 패키지의 이름을 단축시켜 boardVO로 사용하게 합니다. 만약 저것이 없다면 패키지 이름을 다 적어야하는 수고가 생깁니다.

settings에 mapUnderscoreToCamelCase  DB에서 데이터 맵으로 가져오면 자동적으로 카멜케이스를 해주는 용도입니다.

 

 

3. mapperLocations은 실제로 MVC모델로 SQL을 적용할 파일입니다. 각각 id값(메서드의 이름)을 가지며 그것은 유니크해야합니다.

 

 

sqlmap-board.xml

쿼리문에 #{...} 이거 보이시죠? 이게 우리가 코드를 통해 넣을 수 있는 것이죠~

 

 

마지막 빈인 SqlSessionTemplate를 설명드리겠습니다.

 

https://mybatis.org/spring/apidocs/org/mybatis/spring/SqlSessionTemplate.html

 

SqlSessionTemplate (mybatis-spring 2.0.6 API)

java.lang.Object org.mybatis.spring.SqlSessionTemplate All Implemented Interfaces: java.io.Closeable, java.lang.AutoCloseable, org.apache.ibatis.session.SqlSession, org.springframework.beans.factory.DisposableBean public class SqlSessionTemplate extends ja

mybatis.org

 

문서를 읽어보시면 쓰레드 사용시 안전(락?) 용도로 쓰는 것 같습니다.

 

 

5) DAO를 인터페이스 정의하고 쿼리문의 id 값과 일치하는 메서드명을 만듭니다.

 

BoardDAO Interface

 

6) DAO interface를 구현받는 클래스를 만들어 직접 매핑할 Mapper클래스를 만듭니다.( 여기서는 맵퍼라는 개념이 딱히 나오진 않습니다만..)

 

BoardDAO의 구현을 받은 BoardDAOMyBatis Class

 

7) 서비스구현을 하는데 이또한 interface로 구현한다음 상속을받는 Impl 클래스를 만들어 속성에 DAO 객체를 넣어 같은 함수이름으로 매칭시킵니다.

 

Service Interface
구현받은 Impl Class

 

서비스 까지 구현을 완료하였습니다. 이제 실행되는 순서를 그림 순서대로 보여드리겠습니다.

 

 

멤버변수에 주목해주세요. 뭔가 보이지 않나요!!

 

Controller <-> Service <-> BoardDAOMyBatis(Mapper or Repository) <-> DB ( SQL )

 

이 구조가 바로 MVC구조입니다.

 

+MVC에 대한 자세한 설명을 알고싶으시다면!

 

https://m.blog.naver.com/jhc9639/220967034588

 

[개발자 면접준비]#1. MVC패턴이란

오늘은 개발자면접에 많이 나오기도 하는 MVC패턴에 대해서 알아보고자 합니다. 과연 MVC패턴이 무엇...

blog.naver.com

 

여기까지 기본적인 설정입니다. 그리고 !! localhost:8080/mvc/list를 찍어보면 !!

 

result

 

짜잔! 각 리스트 안에 스트링 인스턴스의 메모리 주소가 찍히는 것을 확인 할 수 있습니다!!!

 

https://bitbucket.org/0307kjb/spring_project/commits/4a2e3f0fce4d0f28e5497460c19b7c945a7d5a64

 

0307kjb / spring_project / commit / 4a2e3f0fce4d — Bitbucket

 

bitbucket.org

첫번째 커밋~! 슝슝

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함