BootCamp 44day

GyeongNamยท2024๋…„ 1์›” 18์ผ
0

BootCamp

๋ชฉ๋ก ๋ณด๊ธฐ
38/49
post-thumbnail

๐Ÿ“… 2024๋…„ 01์›” 16์ผ


44์ผ์ฐจ : Spring (4)

Spring + JDBC + MariaDB

  • build.gradle
# ์˜์กด์„ฑ ์ถ”๊ฐ€
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.mariadb.jdbc:mariadb-java-client'
  • application.yml
server:
  port: 8080
spring:
  profiles:
    active: dev
  datasource:
    url: jdbc:mariadb//localhost:3306/member
    username: ์‚ฌ์šฉ์ž ์•„์ด๋””
    password: ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ
  • MemberJdbcRepository
@Repository
public class MemberJdbcRepository implements MemberRepository {
    @Autowired
    private DataSource dataSource;
    @Override
    public List<Member> findAll() {
        try {
            Connection connection = dataSource.getConnection();
            String sql = "select * from member";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            ResultSet resultSet = preparedStatement.executeQuery();
            List<Member> members = new ArrayList<>();
            while(resultSet.next()){
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                String emil = resultSet.getString("email");
                String password = resultSet.getString("password");
                LocalDateTime creat_at = resultSet.getTimestamp("create_at").toLocalDateTime();
                Member member = new Member(name, emil, password);
                member.setId(id);
                member.setCreate_at(creat_at);
                members.add(member);
            }
            return members;
        }catch (SQLException e){
            e.printStackTrace();
        }
        return null;
    }
    @Override
    public Member save(Member member) {
        try {
            Connection connection = dataSource.getConnection();
            String sql = "insert into member(name,email,password) values(?,?,?)";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1,member.getName());
            preparedStatement.setString(2,member.getEmail());
            preparedStatement.setString(3,member.getPassword());
            preparedStatement.executeUpdate();
        }catch (SQLException e){
            e.printStackTrace();
        }
        return null;
    }
    @Override
    public Optional<Member> findById(long id) {
        Member member = null;
        try {
            Connection connection = dataSource.getConnection();
            String sql = "select * from member where id = ?";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setLong(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            while(resultSet.next()){
                int idx = resultSet.getInt("id");
                String name = resultSet.getString("name");
                String emil = resultSet.getString("email");
                String password = resultSet.getString("password");
                LocalDateTime creat_at = resultSet.getTimestamp("create_at").toLocalDateTime();
                member = new Member(name, emil, password);
                member.setId(idx);
                member.setCreate_at(creat_at);
            }
        }catch (SQLException e){
            e.printStackTrace();
        }
        return  Optional.ofNullable(member);
    }
}
  • Member
public class Member {
    private long id;
    private String name;
    private String email;
    private String password;
    private LocalDateTime create_at;
    public Member(String name, String email, String password) {
        this.name = name;
        this.email = email;
        this.password = password;
        this.create_at = LocalDateTime.now();
    }
    public Member() {

    }

JDBC์˜ ๊ตฌ์„ฑ์š”์†Œ

1. JDBC ๋“œ๋ผ์ด๋ฒ„: ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒค๋”๋Š” ํ•ด๋‹น ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
2. JDBC URL: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ URL๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์œ„์น˜ ๋ฐ ์—ฐ๊ฒฐ์— ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•œ๋‹ค.
3. Connection ๊ฐ์ฒด: java.sql.Connection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•œ๋‹ค.
4. Statement ๊ฐ์ฒด: SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ java.sql.Statement ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋กœ, SQL ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.
5. ResultSet ๊ฐ์ฒด: SQL ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” java.sql.ResultSet ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋กœ, ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

Spring + Spring Data JPA + MariaDB

  • build.gradle
# ์˜์กด์„ฑ ์ถ”๊ฐ€
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  • application.yml
 jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MariaDBDialect
    generate-ddl: true
    hibernate:
      # create = ํ…Œ์ด๋ธ” ์‚ญ์ œ ํ›„ ์ƒ์„ฑ
      # update = ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ ์ˆ˜์ •ํ•ด ์ ์šฉ
      # validate = ์‹ค์ œ DB ์™€์˜ ์ฐจ์ด๋งŒ์„ ํ™•์ธ
      # ์‹ค๋ฌด์—์„  update ๋˜๋Š” validate
      ddl-auto: create
    # jap ๊ฐ€ ์ž๋™์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ• ๋•Œ, ์ฟผ๋ฆฌ๊ฐ€ ์ฝ˜์†”์ฐฝ์— ๋ณด์—ฌ์ง€๋„๋ก ์„ค์ •
    # jap ๊ฐ€ ์ž๋™์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ• ๋•Œ, ์ฟผ๋ฆฌ๊ฐ€ ์ฝ˜์†”์ฐฝ์— ๋ณด์—ฌ์ง€๋„๋ก ์„ค์ •
    show-sql: true
  • MemberSpringDataJpaRepository
import com.encore.Spring_basic.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

@Repository
/*
spring data jpa ์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์“ฐ๊ธฐ ์œ„ํ•ด์„œ๋Š” JpaRepository๋ฅผ ์ƒ์†กํ•ด์•ผํ•จ
์ƒ์†์‹œ์— entity ๋ช…๊ณผ ํ•ด๋‹น pk ํƒ€์ž… ๋ช…์‹œ
์‹ค์งˆ์ ์ธ ๊ตฌํ˜„ํด๋ž˜์Šค์™€ ์ŠคํŒฉ์€ SimpleJpaRepository ํด๋ž˜์Šค์— ์žˆ๊ณ 
์‹ค์ง์ ์ธ ๊ตฌ๋™์ƒํ™ฉ์—์„œ hibernate ๊ตฌํ˜„์ฒด์— ๋™์ž‘์œ„์ž„.
SimpleJpaRepository: ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋กœ์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. CRUD ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  Spring Data JPA ์˜ ํŠน์ง•์„ ์ง€์›.
QuerydslJpaRepository: Querydsl ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ตฌํ˜„์ฒด. Querydsl ์€ ํƒ€์ž… ์•ˆ์ „ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.
SimpleJpaBatchRepository: ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ์ตœ์ ํ™”๋œ ๊ตฌํ˜„์ฒด, ๋ฐฐ์น˜ ์ž‘์—…์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.
QueryByExampleExecutor: ์˜ˆ์ œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌํ˜„์ฒด.
JdbcRepository: JDB C๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌํ˜„์ฒด๋กœ, JPA ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
 */
public interface MemberSpringDataJpaRepository extends MemberRepository, JpaRepository<Member, Long> {

}
  • Member
@Getter
@AllArgsConstructor
/*
@Entity ๋ฅผ ํ†ตํ•ด DB ํ…Œ์ด๋ธ” ๋ฐ ์ปฌ๋Ÿผ์„ ์ž๋™ ์ƒ์„ฑ
 */
@Entity
public class Member {
    @Setter
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String name;
    @Column(nullable = false, length = 50)
    private String email;
    private String password;
    @Setter
    @Column(name = "created_at")
    private LocalDateTime create_at;

}

Spring Data JPA ๋ž€?

Spring ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ผ๋ถ€๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“ˆ

1. Repository ์ธํ„ฐํŽ˜์ด์Šค: ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ CRUD ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•œ๋‹ค.
2. ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ: ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ„๋‹จํ•œ ๋ฉ”์†Œ๋“œ ์„ ์–ธ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
3. ๋™์  ์ฟผ๋ฆฌ ์ƒ์„ฑ: ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด ์œ ์—ฐํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
4. Entity ๋งคํ•‘: JPA ์—”ํ„ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ์˜ ๋งคํ•‘์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
5. ํŽ˜์ด์ง• ๋ฐ ์ •๋ ฌ ๊ธฐ๋Šฅ: ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํŽ˜์ด์ง•๊ณผ ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
6. ์‚ฌ์šฉ์ž ์ •์˜ ์ฟผ๋ฆฌ: JPQL์ด๋‚˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

Spring + MyBatis + MariaDB

  • build.gradle
# ์˜์กด์„ฑ ์ถ”๊ฐ€
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
  • application.yml
mybatis:
  mapper-locations: classpath:/mapper/**/*.xml
  • MemberMyBatisRepository
/*
MyBatis ์“ฐ๊ฒ ๋‹ค๋Š” ์–ด๋…ธํ…Œ์ด์…˜
 */
@Mapper
@Repository
public interface MemberMyBatisRepository extends MemberRepository{
    /*
    ๋ณธ๋ฌธ์— MyBatisRepository ์—์„œ ์‚ฌ์šฉํ•  ๋ฉ”์„œ๋“œ ํ˜•์‹œ์„ ์ •์˜ํ•ด์•ผ ํ•˜๋‚˜,
    MemberRepository์—์„œ ์ƒ์† ๋ฐ›๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์ƒ๋žต ๊ฐ€๋Šฅ
    ์‹ค์งˆ์ ์ธ ์ฟผ๋ฆฌ๋“ฑ ๊ตฌํ˜„์€ resources/mapper/MemberMapper.xml ํŒŒ์ผ์— ์ˆ˜ํ–‰
     */
}
  • MemberMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!-- mapper DTD ์„ ์–ธ -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.encore.Spring_basic.repository.MemberMyBatisRepository">
    <!-- ์ €์žฅ (Save) -->
    <select id="save">
        INSERT INTO member(name, email, password ) VALUES
            (#{name}, #{email}, #{password})
    </select>

<!--    <insert id="save">-->
<!--        INSERT INTO member(name, email, password, created_at) VALUES-->
<!--            (#{name}, #{email}, #{password}, #{create_at})-->
<!--    </insert>-->
    <select id="save" resultType="com.encore.Spring_basic.domain.Member">
        INSERT INTO member(name, email, password, created_at) VALUES
            (#{name}, #{email}, #{password}, #{create_at})
    </select>

    <!-- ์ „์ฒด ์กฐํšŒ (FindAll) -->
    <select id="findAll" resultType="com.encore.Spring_basic.domain.Member">
        SELECT * FROM member
    </select>
</mapper>

MyBatis๋ž€?

์ž๋ฐ” ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, SQL ์ฟผ๋ฆฌ์™€ ์ž๋ฐ” ๊ฐ์ฒด ๊ฐ„์˜ ๋งคํ•‘์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

1. SQL ๋งคํ•‘: SQL ์ฟผ๋ฆฌ์™€ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ XML ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งคํ•‘ํ•œ๋‹ค.
2. ๋™์  SQL: ๋™์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋™์  SQL ์ƒ์„ฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
3. ์ž๋™ ๋งคํ•‘: ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ž๋™์œผ๋กœ ์ž๋ฐ” ๊ฐ์ฒด์— ๋งคํ•‘ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.
4. ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ: JDBC์˜ ํŠธ๋žœ์žญ์…˜์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
5. ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ง€์›: ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ง€์›์„ ์ œ๊ณตํ•˜๋ฉฐ, ์„ค์ •์„ ํ†ตํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

Spring ์‹ค์Šต github ๋งํฌ

profile
503 Service Unavailable Error

0๊ฐœ์˜ ๋Œ“๊ธ€