SPRING

[TIL] 23.04.04 스프링

김짝 2023. 4. 4. 09:21

이미지를 여러개 업로드 하는방법

<input type="file" name="photo" class="form-control" style="width: 200px;" multiple="multiple">

input태그에 multiple 옵션을 넣어준다.

 

controller의 메서드 파라미터에 @RequestParam ArrayList<MultipartFile> photo, 이렇게 리스트로 받는다.

 

 

ArrayList<String> files = new ArrayList<String>();

    //파일명 담기
    for(MultipartFile f : photo) {
        String fileName = "p_"+sdf.format(new Date()) + "_" + f.getOriginalFilename();
        files.add(fileName);

        //업로드
        try {
            f.transferTo(new File(path + "\\" + fileName));
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    model.addObject("files", files);

수정된 컨트롤러 코드

 

mysql에서 계정만들고 스키마(db) 만들기

계정을 workbench에서 만들고 그 계정으로 들어가서 스키마(원형통)를 하나 만들어준다.

cmd에서 저장하는 코드는

>mysql -u springheesoo -p

아까 스키마를 만들어줬다면

>show databases;

를 칠 경우 만들어준 스키마가 보인다.

 

jdbc url : jdbc:mysql://localhost:3306/{db명(스키마명)}?serverTimezone=Asia/Seoul

 

 

인데 mysql workbench에서는 계정 우클릭하고 copy jdbc~~를 누르면 비슷하게 나오긴한다.

 

jdbc:mysql://127.0.0.1:3306/?user=springheesoo
jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul

 

퀀텀db설치법

https://sallykim5087.tistory.com/127  

 

~~

Mybatis 세팅

mybatis를 쓰기위해 mvnrepo에서 아래 의존성 코드가져온다

 

mybatis, mybatis spring, Spring jdbc, mysql connecter j

받아온다.

 

받은 코드는 pom.xml에 적어준다.

 

mybatis-config.xml

src/main/resources폴더에 mybatis-config.xml 만든다.

mybatis-config.xml에 아래 doctype 넣어준다.

하는 역할은 스프링에 dto를 등록하면서, 별칭을 넣어주는 역할이다(너무길어서, 다른곳에서 쓸때 사용할 별칭설정)

<!-- 이 Doctype넣어주고 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 아래에 dto있을때마다 등록해준다. -->
<configuration>
	<typeAliases>
		<!-- alias는 resultType에서 쓴다. -->
		<typeAlias alias="CarDto" type="spring.db.car.MyCarDto"/>
		
	</typeAliases>
</configuration>

 

Mapper가 뭔가?

model 1 방식에서 dao안에 sql문을 적어줬는데 Mybatis에서는 여기에 Mapper에 넣어준다.

 

https://twofootdog.github.io/Spring-DAO%EC%99%80-Mapper%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90/

 

 

src/main/resources폴더에 mapper패키지만들고 안에 mycarMapper.xml 만들고

mycarMapper.xml에 아래 doctype을 넣어주고, 그 아래에 sql문을 적는다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mycar">
	<select id="getTotalCountOfMyCar" resultType="int">
		select count(*) from mycar
	</select>
	
	<select id="getAllDatasOfMycar" resultType="CarDto">
		select * from mycar order by num desc
	</select>
	<insert id="insertOfMyCar" parameterType="CarDto">
		insert into mycar (carname,carprice,carcolor,carguip) values(#{carname},#{carprice},#{carcolor},#{carguip})
	</insert>
	
	<!-- resultType:반환타입, parameterType:파라미터의 타입 -->
	<select id="getOneDataOfMyCar" resultType="CarDto" parameterType="String">
		select * from mycar where num=#{num}
	</select>
	
	<update id="updateOfMyCar" parameterType="CarDto">
		update mycar set carname=#{carname}, carprice=#{carprice}, carcolor=#{carcolor}, carguip=#{carguip} where num = #{num}
	</update>
	
	<delete id="deleteOfMyCar" parameterType="String">
		delete from mycar where num = #{num}
	</delete>
</mapper>

모든 sql명령어는 태그로 감싸져 있다. 속성중 id는 Dao에서 접근할때 사용한다.

resultType은 반환타입이고 parameterType은 파라미터로 들어오는 데이터의 타입이다.

 

 

root-context.xml

root-context.xml은 bean설정하고 dao에 필요한 팩토리 연결하는 곳, mysql에 대한 설정도 여기서 한다. 세션팩토리도 적음(세션팩토리가 Mapper랑 mybatis 설정).

경로 : src/main/webapp/WEB-INF/spring/root-context.xml

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul"></property>
    <property name="username" value="springheesoo"></property> 
    <property name="password" value="1234"></property>
</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/*Mapper.xml"/>
</bean>

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

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

driverClassName과 url, username,password를 수정해주는데

driverClassName : Driver class name

url은 위의 jdbc url(가운데 spring은 스키마 이름이다.)

username : 나의 계정이름 password:password

 

configLocation의 value : classpath:mybatis-config.xml(이름적어준다.)

mapperLocations의 value : classpath:mapper/매퍼이름.xml 인데 *Mapper.xml로 뒷부분 통일해줌.

 

configLocation은 mybatis위치(mybatis-config.xml)를 적는거고

mapperLocation도 mapper의 위치를 적는것이다.

 

Dao에 적는 것

클래스 선언부 위에 @Repository 적는다.

클래스 안의 맨 위에 SqlSession session을 선언하는데 @Autowired로 등록해준다.

SqlSession 설명 : https://mybatis.org/spring/ko/sqlsession.html

 

기존 model 1 방식처럼 dao를 적되 SqlSession를 이용한다. SqlSession로 session이란 변수를 만들었다고 가정하고 아래처럼 적는다.

@Repository // dao를 bean에 등록
public class MyCarDao {
	@Autowired
	private SqlSession session;
	
	// 총개수
	public int getTotalCount() {
		//select할게 하나면 selectOne 여러개면 selectList
		return session.selectOne("getTotalCountOfMyCar");// mycarMapper의 id를 넣어준다.
	}

	// 전체 데이터
	public List<MyCarDto> getAllDatas() {
		return session.selectList("getAllDatasOfMycar");
	}

	// insert
	public void insertMyCar(MyCarDto dto) {
		session.insert("insertOfMyCar", dto);
	}
	
	// 수정폼
	public MyCarDto getData(String num) {
		//파라미터가있으면 파라미터가 두개인걸 고름.
		return session.selectOne("getOneDataOfMyCar", num);
	}
	
	public void updateMyCar(MyCarDto dto) {
		session.update("updateOfMyCar", dto);
	}
	
	//delete
	public void deleteMyCar(String num) {
		session.delete("deleteOfMyCar", num);
	}
}

session.여기에는메서드명("mapper에서적은 불러올 id", "입력값이 있을경우 적는다.")

 

 

 

 

그후 controller를 수정한다.

사용하는 Dao를 controller아래에 하나 선언하고 @Autowired로 감싼다.

메서드에 파라미터로 이전 페이지에서 num같은것을 넘겨받을것이 있으면 @RequestParam String num 이런식으로 적는다. Model로 값을 넘길거면 Model model도 적는다. (ModelAndView를 써도 된다.)

@ModelAttribute는 사용자가 요청시 전달하는 값을 오브젝트 형태로 매핑해주는 어노테이션인데 설명하면

이전 페이지에서 값을 넘길때 여러가지값들을 넘기면, 넘긴 각각의 값들이 @ModelAttribute의 뒤에 적힌 객체(dto)로 바인딩된다.

 

@Controller
public class CarController {
	
	@Autowired
	MyCarDao dao;
	
	@GetMapping("/samsung/list")
	public String list(Model model) {
		//전체개수
		int totalCount = dao.getTotalCount();
		
		//목록가져오기
		List<MyCarDto> list = dao.getAllDatas();
		
		//request에 저장.
		model.addAttribute("totalCount", totalCount);
		model.addAttribute("list", list);
		
		return "car/carlist";
	}
	
	@GetMapping("/samsung/writeform")
	public String write() {	
		return "car/writeform";
	}
	
	//insert
	@PostMapping("/samsung/write")
	public String insert(@ModelAttribute MyCarDto dto) {
		dao.insertMyCar(dto);
		return "redirect:list";//redirect시에는 이런식으로 쓴다.(/samsung/write -> /samsung/list)
	}
	
	//수정폼으로 가기
	@GetMapping("/samsung/updateform")
	public String updateform(/*form에서 가져올정보를 가져온다.*/@RequestParam String num, Model model) {
		//dto가져오기
		MyCarDto dto = dao.getData(num);
		
		//저장
		model.addAttribute("dto", dto);
		
		return "car/updateform";
	}
	
	//액션
	@PostMapping("/samsung/update")
	public String update(@ModelAttribute MyCarDto dto) {
		dao.updateMyCar(dto);
		return "redirect:list";
		
	}
	
	@GetMapping("/samsung/delete")
	public String delete(@RequestParam String num) {
		dao.deleteMyCar(num);
		return "redirect:list";
	}
	
}

 

 

 

explorer 이미지

 

 

개발할때

sql(mapper)먼저 적고 dao 적고 controller 순으로 개발한다. 디스패처서블릿은 반대임.

 

 

mapper는 sql문을 적는다

dao에는 mapper에 쓴 것을 id로 불러온다.