[TIL]20250310

김민석·2025년 3월 10일
post-thumbnail

오늘 목표

  • 수업내용 복습 및 정리하기(O)
  • 미니 프로젝트 페어와 의논하기(O)
  • 프로그래머스 문제풀기(O)

배운 내용

MyBatis

자바 오브젝트와 SQL사이의 자동 매핑 기능을 지원하는 프레임워크
MyBatis는 JDBC를 통해 RDMBS에 엑세스하는 작업을 캡슐화 및 중복 작업을 간소화해줌
XML 파일의 형태인 Mapper를 통해 SQL 쿼리가 분리되는 환경을 제공하고 Java 객체와 매핑하는 작업을 도와줌

JDBC 코드

package com.shop.cafe.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;

import com.shop.cafe.dto.Member;

@Repository
public class MemberDao {
	
	@Value("${spring.datasource.driver-class-name}")
	private String DB_DRIVER;
	
	@Value("${spring.datasource.url}")
	private String DB_URL;
	
	@Value("${spring.datasource.username}")
	private String DB_USER;
	
	@Value("${spring.datasource.password}")
	private String DB_PW;
	
	public void insertMember(Member m) throws Exception {
		Class.forName(DB_DRIVER);	
		String sql="insert into member(nickname, pwd, email) values(?,?,?)";
		try(
			Connection con=DriverManager.getConnection(DB_URL,DB_USER,DB_PW);	
			PreparedStatement stmt=con.prepareStatement(sql);
				
				){
			stmt.setString(1, m.getNickname());
			stmt.setString(2, m.getPwd());
			stmt.setString(3, m.getEmail());
			int i=stmt.executeUpdate();
			System.out.println(i+"행이 insert되었습니다");
		}
	}
}

MyBatis 사용해보기

1.먼저 myBaits의 라이브러리를 얻기 위해 pom.xml에 아래 코드를 추가한다.

    <dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter-test</artifactId>
			<version>3.0.4</version>
			<scope>test</scope>
		</dependency>

2.그 후 resources폴더에 mapper라는 폴더를 만든 후 xml 파일을 하나 만들어 준 후 아래의 코드를 입력한다.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
<mapper namespace="com.shop.cafe.dao.ProductDao">

  <select id="getAllProducts" resultType="Product" >
    select * from product
  </select>
  
</mapper>

여기서 mapper의 namespace에는 com.shop.cafe.dao.ProductDao 인터페이스와 연결된다는 것을 의미하도록 넣어줍니다.
현재 getAllProducts는 select문을 구사하기 때문에 select 태그로 감싸줘 resultType은 return Type을 넣어준다 그 후 select문 안에
product를 가져오도록 select * from product를 넣어준다.

3.application.properties에 등록하기

logging.level.com.shop.cafe=debug //로깅 레벨을 DEBUG로 설정

mybatis.type-aliases-package=com.shop.cafe.dto 
mybatis.mapper-locations=mapper/*.xml //MyBatis 매퍼 XML 파일을 자동으로 로드합니다.

mybatis.type-aliases-package=com.shop.cafe.dto
별칭을 사용하면 매퍼 XML에서 클래스의 전체 경로를 생략할 수 있습니다.

사용 예시

//사용안함
<select id="getAllProducts" resultType="com.shop.cafe.dto.Product">
//사용 후
<select id="getAllProducts" resultType="Product">

4.Dao 파일을 interface로 바꿈

package com.shop.cafe.dao;

import java.util.*;
import org.apache.ibatis.annotations.Mapper;
import com.shop.cafe.dto.Product;

@Mapper
public interface ProductDao {
	public  List<Product> getAllProducts() throws Exception;
}

회원 가입 시 nickname이 충분히 큰 사이즈로 되어있게 해보자 VARCHAR()의 크기

  • 메모리 및 스토리지 비효율성
    덱스를 생성하거나 메모리에서 데이터를 처리할 때는 최대 길이를 고려하기 때문에 사용하지 않는 공간이 생성 될 수 있음.
  • 데이터 검증의 어려움
    VARCHAR의 길이를 너무 길게 설정하면 예상보다 긴 데이터를 저장할 가능성이 커져 데이터 무결성 및 검증이 어려워질 수 있습니다.

회원이 제품의 리뷰를 썻을 때 구조

XSS

관리자가 아닌 이가 웹 사이트에 악성 스크립트를 삽입할 수 있는 취약점을 가지고 있음.

XSS 대응방안

  • 웹 서버에서 입력 값에 정의된 문자를 검증하여 클라이언트 측에서 실행될 수 있는 스크립트 명령이 삽입되지 않게한다.
  • HTML 태그가 불필요한 경우 HTML 특수 문자들을 HTML Entiti로 변환하여 문자열로 인식되도록 함.
  • HTML 태그를 사용할 경우 블랙리스트 화이트리스트 방식을 통해 반드시 사용해야 하는 특정태그만 사용 가능하게함.

tabnabbing


window.opener는 현재 창을 열어준 부모 창(원래 탭)의 window 객체를 가리킵니다. 그것을 fake.html로 변환해 악성페이지로 만듭니다.

tabnabbing 실습

업로드중..
이미지를 받아와 fake 페이지를 넣어 링크 클릭 시 fake 페이지로 이동 시켜 로그인 하면 정보를 빼오는 실습

:5500에서 :8080으로부터 받은 JSESSIONID를 저장했어도 다음 요청 시 쿠키를 가지고 가지 못하는 문제

토큰으로 해결하기

profile
나만의 기록장

0개의 댓글