스프링의 구조 ( 스프링 시작하는 사람이라면 이거보고 들어가 !!)

민이의 기술 노트 ·2023년 8월 15일
3
post-thumbnail

안녕하세요 ! 민 입니다 . 이틀 전에 스프링의 개념에 대해서 블로그를 작성해보았는데요. 역시 코딩은 백문이 불여일견이죠 . 개념을 알아도 사용해보지 않으면 모르는것과 다름없듯이 스프링을 사용해보면서 그 예시와 설명을 확인해보시죠 !

목차
1. 스프링의 구조
2. 구조에 대한 설명
3. 요약

💁‍♂️ 1. 스프링의 전체적인 구조

스프링으로 인터넷강의를 보시거나 공부해보시면 구조가 눈에 들어오실 것 입니다 .

스프링의 구조

pom.xml
web.xml
root-context.xml
servlet-context.xml
Repository
Service
Controller
Mapper
Mybatis
DTO

이번 블로그에서 말씀드릴것은 각각의 요소들이 어떠한 역할을 하는지에 대해서만 말씀 드리려고 합니다 . 세세하게 말씀드리는것은 따로 블로그를 올려드리도록 할게요 !! 전체적인 구조를 알고 게시판과 같은 간단한 프로젝트를 만들어보시면서 아 이건뭐지 ?? 이런 생각이 드신다면 세세하게 작성된 블로그를 확인해주시면서 공부해주셔도 좋을 것 같아요 .

보통 이런식으로 총 10가지 구조를 가지게 되어있는데요 . 처음보는 것도 있고 DTO 같은 경우에는 평소에도 본 것 같고 그러시죠 ??
하나씩 사진과 코드로 설명해드리겠습니다 .
...

2. 스프링의 구조에 대한 설명 !

  1. pom.xml 파일을 보면 groudId로 감싸져있고 굉장히 길고 버전이 나타나 있는 것을 확인할 수 있죠 ??

pom.xml 은 저희가 프로젝트를 만들고 사용할 때 설정할 라이브러리에 대한 정보가 들어가 있습니다 .

이 말은 Spring 파일의 pom.xml 은 Maven 으로 라이브러리를 끌어와서 사용할 수 이다는 것을 이야기 합니다 . (Maven ➡️ 프로젝트를 빌드해주고 라이브러리를 관리하며 개발자들이 업무 환경에서 협력하며 일을 할 수 있도록 개발 된 도구입니다. )

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <java-version>11</java-version>
    <org.springframework-version>5.3.20</org.springframework-version>
    <org.slf4j-version>1.7.25</org.slf4j-version>
  </properties>

2.web.xml

저희가 가져다 쓸 라이브러리를 확인했다면 이제는 Spring을 사용하기 위한 기본적인 설정을 해야겠죠 ? 그 기본적인 설정을 해주는 게 web.xml 입니다. web.xml 에 기본적인 설정을 해두면 스프링 프레임워크(Spring Framework)에서 web.xml은 WAS(Web Application Server)가 최초로 구동될 때, web.xml 파일을 읽어서 메모리에 올리고 web.xml에는 웹에서 사용하는 다양한 설정들을 하는 곳이라고 할 수 있습니다.

3.root-context.xml
모든 서블릿이 공유할 수 있는 Bean들이 모인 공간으로 공통 bean을 설정
JSP와는 관련없는 객체(Bean)을 설정하고 스프링 MVC 설정과 관련된 여러 처리를 담당한다.


    <!-- 데이터베이스 이름 및 계정 확인 -->
    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE" />
        <property name="username" value="system"/>
        <property name="password" value="1234"/>
    </bean>

    <!-- 현재 프로젝트 패키지 경로 맞는지 확인 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value ="classpath:/mybatis-config.xml" />
        <property name="mapperLocations" value="classpath:/mapper/*.xml" />
    </bean>

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>

View와 밀접하지 않은 정보를 기술하는 xml 파일
DB는 View(JSP)와 관련이 없으므로, DB 접속은 root-context.xml 에 설정

그럼 자동적으로 view에 대한 설정을 하는 파일이 존재해야 할 텐데
그 기능을
4. servlet-context.xml 에서 담당해줍니다.

💁‍♂️ 4 ~ 8 Controller , Service , Repository , DTO

1.Controller는 view(jsp)에서 요청이 들어올경우 데이터를 받아서 서비스로 넘겨줍니다 .

 @PostMapping("/save")
    public @ResponseBody List<CommentDTO> save(@ModelAttribute CommentDTO commentDTO) {
        System.out.println("commentDTO =" + commentDTO);
        commentService.save(commentDTO);
        // 해당 게시글에 작성된 댓글 리스트를 가져
        List<CommentDTO> commentDTOList = commentService.findAll(commentDTO.getBoardId());
        return commentDTOList;
    } --> service를 사용해서 넘겨주는게 보이시죠 ??

2.Service는 DAO를 아신다면 DAO와 동일하게 로직을 수행하여서 -> Repository에 넘겨주는 기능을 합니다 .

public class CommentService {

    private final CommentRepository commentRepository;

    public void save(CommentDTO commentDTO) {
        commentRepository.save(commentDTO);
    }

    public List<CommentDTO> findAll(Long boardId) {
        return commentRepository.findAll(boardId);
    }
} 
  --> 여기서는 Repository로 넘겨줍니다 .

3.Repository에서는 DB 통신이 필요할 때 사용합니다.

public class CommentRepository {

    private final SqlSessionTemplate sql;

    public void save(CommentDTO commentDTO) {
        sql.insert("Comment.save" , commentDTO);
    }

    public List<CommentDTO> findAll(Long boardId) {
        return sql.selectList("Comment.findAll", boardId);
    }
}
 --> sql을 이용해서 DB와 접근 !!

4.DTO는 이 사이에서 필요한 변수들을 선언해줍니다 .

public class CommentDTO {
    private Long id;
    private String commentWriter;
    private String commentContents;
    private Long boardId;
    private Timestamp commentCreatedTime;
} --> 필요한 변수들을 선언해줍니다. 

DB에서 정보를 받아서 다시 차례대로 Repository->Service->Controller -> View 에게 차례대로 넘겨줍니다 😀

그럼 이제 90프로 왔습니다 . 앞으로는 mybatis와 mapper에 대한 설명만이 남았는데요. 바로 확인하러가시죠!!
.
9. mybatis -> jdbc 드라이버를 간략하고 쉽게 사용할 수 있도록 해준다 . ( 이건 설명이 너무 많이 필요해서 간략하게 작성해보았습니다.)
10. Mapper -> sql문을 작성해서 오류가 최대한 발생하지 않도록 도와준다 .

<mapper namespace="Comment">
    <insert id="save" parameterType="comment">
        insert into comment_table(id , commentWriter, commentContents, boardId , commentCreatedTime )
        values(comment_seq.NextVal , #{commentWriter}, #{commentContents}, #{boardId} , sysdate)
    </insert>

    <select id="findAll" parameterType="Long" resultType="comment">
        select * from comment_table where boardId=#{boardId} order by id desc
    </select>
</mapper>
--> 평소에 작성하는 코드보다 훨 씬 더 깔끔하게 정리가 된 걸 확인할 수 있죠 ?

🥸 3. 요약 !

1.pom.xml -> '라이브러리를 가져온다'
.
2.web.xml -> '기본설정 + WAS가 처음 구동될 때 사용되는 설정'
.
3.root-context.xml -> view에 관한 설정 말고 모든 설정
DB,Service, Repository , Controller 등
.
4.servlect-context.xml -> view에 관한 설정
.
5.Controller -> view에 대한 요청처리 + Service로 넘긴다
.
6.Service -> 비즈니스 로직 수행 -> Repository로 넘김
.
7.Repository -> DB와 연결을 해서 값을 가져온다.
.
8.DTO -> Controller , Service , Repository 에서 사용하는 변수기술
.
9.mybatis -> JDBC를 조금 더 편히하게 사용
.
10.mapper -> sql문을 조금 더 간결하게 사용하도록

각각의 특징을 살펴보면 뭔가 조금 더 쉽게 사용하고 해주고 설정을 해 주는 구조라는 걸 파악할 수 있죠 ?? Spring 으로 간단한 프로젝트를 만들어보면서 이건 이런 구조구나 파악해보는 시간을 가지시면 좋겠습니다 .

오늘 하루도 빡코 !!!

profile
항상 성장하고 있는 개발자입니다!

0개의 댓글