SpringMVC Board CRUD

최고고·2022년 11월 9일
0
  • 스프링과 자바 버전 바꿔줘야됨 1.6 -> 11로
    예제에 따라서 버전 바꿀 수있음 pom.xml에서 자바 버전 아래 프레임워크버전 변경
    플러그인 태그 중 maven-compiler-plugin 내용 바꿈 jdk가 11버전이므로 11로

  • 프로젝트 우클릭 메이븐 업데이트 프로젝트

  • 서버 스타트

  • 크롬 주소입력창에 localhost:포트번호/내가지정한 context path 엔터 땅 치면 헬로월드 나옴(보안폴더 - home.jsp로 연결됨)**WEB-INF 디렉토리에 뷰인 jsp : 무조건 FrontController를 거쳐 컨트롤러가붙은 POJO를 통해 jsp가 실행됨

  • 롬복 파일 받기 (getter setter 생성자 toString 메소드 등 간편하게 어노테이션으로 설정하는 라이브러리)
    https://projectlombok.org/ 에서 다운로드 후
    cmd창 - cd jdk설치경로\bin 파일
    java -jar lombok.jar
    엔터
    압축 풀어줌
    고추그림 화면이 나오면 specify location에서 이클립스가 설치된 경로 찾고, eclipse.exe 선택하고 인스톨
    pom.xml에 API 태그 추가함


web.xml 에서 인코딩필터 태그 등록

  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

pom.xml

  • maven 안에 있는 라이브러리 사용가능
  • dependencies태그 내에 dependency를 통해 필요한 라이브러리 추가
  • jdbc 라이브러리

추가한 태그 목록 < 버전 유의해서 맞추기

	<!-- GSON 라이브러리 추가 -->
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>
<!-- lombok 라이브러리 추가 -->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
    <scope>provided</scope>
</dependency>
<!-- mybatis 라이브러리 추가 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>
<!-- hikaricp 라이브러리 추가 -->
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>2.7.4</version>
</dependency>

<!-- Spring-jdbc, mybatis-spring api 추가 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.0.7.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.0</version>
</dependency>
       <!-- MySQL connector j -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.31</version>
        </dependency>
        
  • properties 태그 스프링 버전 확인
	<properties>
		<java-version>1.6</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>

root-context.xml

  • Service, Repository(dao) 등의 servlet과 관계없는 설정
  • 히카리 CP 빈 등록
    MyBatis 스키마 추가 커넥션풀 여러개 사용하는 히카리CP 태그, MySQL 태그
  • MyBatis, DB 관련설정
  • sqlSessionFactory Bean, dataSource
    sqlSessionFactory는 뭐냐?
    내부적으로 sqlSession을 만들어내고 DataSource를 참조하여 MyBatis와 db 서버를 연동시켜줌
    개발시 sqlsession을 통해 Connection을 생성하거나 원하는 sql을 전달하고 결과를 리턴받는구조로 작성함
    클래스명은 mybatis-spring라이브러리 클래스다
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd
    http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring">
	<!-- Root Context: defines shared resources visible to all other web components -->
	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName"
			value="com.mysql.jdbc.Driver">
		</property>
		<property name="jdbcUrl"
			value="jdbc:mysql://localhost:3306/mysql"></property>
		<property name="username" value="계정명"></property>
		<property name="password" value="비번"></property>
	</bean>

	<!-- 히카리 CP 설정 -->
	<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
		destroy-method="close">
		<constructor-arg ref="hikariConfig" />
	</bean>

	<!-- sql xml db 연결 sqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<mybatis-spring:scan base-package="kr.web.mapper" ></mybatis-spring:scan>
</beans>

servlet-context.xml

  • DispatcherServlet의 설정
    컨트롤러의 위치를 scan한다 <context:component-scan base-package="..~~" />
  • 뷰의 이름, 위치 등 뷰 리졸버 관련 설정

맨 아래부분에 패키지명 확인하기

	<context:component-scan base-package="kr.web.board" />



기본 CRUD는 전에 배웠던
https://velog.io/@ggg4155?tag=Spring
게시판 참고해서 만들었음 ---> 완
https://github.com/Goeuneun/board-test.git
게시글 등록(insert)시 인코딩 에러난 부분은 테이블 생성할 때 인코딩조건을 안줬음 ---> ALTER TABLE member convert to charset utf8 테이블 구조 변경 명령어 사용한다!
첨에 생성할 시 create문 맨 뒤에 붙이기 - ENGINE=InnoDB DEFAULT CHARSET=utf8

  • 여기서 엔진은 데이터 엔진
    -InnoDB:트랜젝션 지원,빈번한 쓰기, 수정, 삭제시 처리 능력/ 디스크, 전원 등의 장애 발생시 복구 성능 / 동시처리가 많은 환경에 적합 / Row 단위 락킹
    -MylSAM:상대적으로 높은 성능, 읽기 위주의 요청에 유리, 테이블 단위 락킹
    -MEMORY:Hash 인덱스를 기본으로 사용해 아주 빠름, 당연히 서버가 다운되면 데이터 날라감. 임시 테이블이나 고정 데이터용으로 적합, 데이터 전체를 파일로 보관했다가 DB가 재시작할 때 로드할 수 있게 하거나, 혹은 Master-Slave로 구성하여 Master가 재시작할 때 Slave의 데이터를 동기화 하는 방법이 있다.
    출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=imf4&logNo=220760337928

스프링에서 Logging 하는 이유:
System.out.println()을 할경우 IO리소스 많이 사용해서 시스템느려질수있음-> 때문에 로그를 파일로 저장해 분석
롬복 SLF4J는 인터페이스이고, 그 구현체로 Logback 같은 로그 라이브러리를 선택.
private final Logger log = LoggerFactory.getLogger(getClass());
@SLF4J

쓰레드 정보, 클래스 이름 같은 부가 정보 볼수있고 출력 모양을 조정할 수 있다.
로그 레벨에 따라 개발 서버에서는 모든 로그를 출력하고, 운영서버에서는 출력하지 않는 등 로그를 상황에 맞게 조절 가능..
시스템 아웃 콘솔에만 출력하는 것이 아니라, 파일이나 네트워크 등, 로그를 별도의 위치에 남길 수 있다. 특히 파일로 남길 때는 일별, 특정 용량에 따라 로그를 분할하는 것도 가능하다.
성능도 일반 System.out보다 좋다. (내부 버퍼링, 멀티 쓰레드 등등) 그래서 실무에서는 꼭 로그를 사용해야 한다
출처 : https://doublesprogramming.tistory.com/82


파일 업로드, 페이징 처리 구현 고고.


페이징 처리

  • get방식만 이용해 처리 (페이징처리는 다른사람에게 URL로 전달하기 땜에 get방식으로만 처리하는것임)
  • 페이징 처리 되면 조회하면에 반드시 목록가기가 필요함
  • 한 페이지에 10개씩 데이터를 출력하는 경우라면, 전체 데이터가 32건이 있을 때에는 4페이지까지만 화면에 출력돼야 합니다. 더 많은 데이터가 있을 때에는 적당한 수의 페이지 번호를 출력하고, 뒤로 가는 화살표 등을 이용해서 보여줘야 합니다.
  1. 페이지 데이터 화면에 출력
  2. 화면 하단에 페이지 번호 표시, 클릭시 이동
  3. 목록가기 선택시 보던 페이지 정보 유지한 채 이동

전체 데이터중 일부분의 데이터만 출력할 때 MySQL은 limit 구문 사용

select ...,\
from board
where ... 
order by ...
limit 시작데이터 ,데이터 개수

		//10개씩 데이터 출력 : 
        1페이지 limit 0,10 2페이지 limit 10,10

페이징 처리를 위해 임의의 데이터 100개가량 넣어줬다.
insert into board(title, contents, writer) (select title, contents, writer from board);
MySQL에서 이 구문은 현재 데이터의 배수만큼 데이터가 들어감

0개의 댓글