본문 바로가기

컴퓨터공부/Java

[java 자바공부] @Noargsconstructor, 인코딩과 이스케이핑 이란?, JPA 추상화란?, 스프링부트에서 네이티브 쿼리란 무엇인가?, REsultSet 이란?,

by Life & study 2023. 10. 31.
반응형

[java 자바공부] @Noargsconstructor, 인코딩과 이스케이핑 이란?, JPA 추상화란?,  스프링부트에서 네이티브 쿼리란 무엇인가?, REsultSet 이란?,  

 

 

[java 자바공부] @Noargsconstructor

 

@NoArgsConstructor
기본 생성자를 생성해준다.

이 경우 초기값 세팅이 필요한 final 변수가 있을 경우 컴파일 에러가 발생함으로 주의한다.

@NoArgsConstructor(force=true) 를 사용하면 null, 0 등 기본 값으로 초기화 된다.

 

 

 

 

 

 

[java 자바공부] @AllArgsConstructor 어노테이션

 

코드 간결성: @AllArgsConstructor를 사용하면 모든 필드를 파라미터로 받는 생성자를 자동으로 생성해줍니다. 이로 인해 개발자가 직접 생성자를 작성할 필요가 없어져 코드의 길이와 복잡성을 줄일 수 있습니다.
유지보수성: 클래스의 필드가 변경될 때마다 생성자도 함께 수정해야 하는 번거로움을 줄일 수 있습니다. 예를 들어, 새로운 필드가 추가되면 @AllArgsConstructor 어노테이션을 사용한 경우에는 자동으로 해당 필드를 포함하는 생성자가 만들어지지만, 그렇지 않은 경우에는 개발자가 직접 생성자 코드를 수정해야 합니다.


실수 방지: 개발자가 직접 작성한 코드에는 실수할 가능성이 있습니다. 반면 @AllArgsConstructor 어노테이션은 컴파일러에 의해 자동으로 처리되므로 이런 문제에서 상대적으로 안전합니다.
그러나 @AllArgsConstructor 어노테이션을 사용하지 않는 것도 일부 상황에서는 유리할 수 있습니다:

파라미터 순서: @AllArgsConstructor 어노테이션이 만들어주는 생성자의 파라미터 순서는 클래스의 필드 선언 순서와 동일합니다. 따라서 이 순서가 중요한 경우에는 개발자가 직접 정확한 순서로 파라미터를 가진 생성자를 작성하는 것이 좋습니다.


선택적인 값: 일부 값들은 선택적일 수 있고 기본값을 가질 수 있는데, 이런 값을 갖는 클래스의 경우 모든 값을 받아야 하는 @AllArgsConstructor 보다 기본값 설정 등 더 섬세한 제어가 가능한 별도의 생성자나 빌더 패턴 등을 고려할 수 있습니다.


명시적인 코드: Lombok과 같은 라이브러리 없이 표준 Java만 사용하고 싶거나, 명시적인 코드 작성 방식을 선호하는 팀에서는 Lombok 대신 직접 메소드를 작성할 수 있습니다. 이 경우 코드는 길어지지만, 모든 동작이 명확히 코드로 표현되므로 유지보수에 있어서 이해하기 쉬울 수 있습니다.

 

 

@AllArgsConstructor

 

를 사용하면 

 

java
import lombok.AllArgsConstructor;

@AllArgsConstructor
public class Person {
    private String name;
    private int age;
    private String address;
}


이 경우, Person 클래스는 자동으로 다음과 같은 생성자를 가집니다:

java
public Person(String name, int age, String address) {
    this.name = name;
    this.age = age;
    this.address = address;
}

 

 

결론,

@AllArgsConstructor

this.로 지정안해도된다!

 

 

 

[java 자바공부] 인코딩과 이스케이핑 이란?

"인코딩(Encoding)"과 "이스케이핑(Escaping)"은 모두 특정 문자열을 다른 형태로 변환하는 과정을 의미합니다.

인코딩(Encoding):
인코딩은 정보의 형태나 형식을 표준화하는 과정입니다. 예를 들어, 문자열을 바이트 배열로 변환하는 것이 인코딩에 해당합니다. 자바에서는 문자열을 바이트 배열로 인코딩하는 경우, "getBytes()" 메서드를 사용할 수 있습니다.

 

java
String str = "안녕하세요";
byte[] bytes = str.getBytes("UTF-8");

 

 

이스케이핑(Escaping):
이스케이핑은 문자열 내에서 특수 문자가 가진 원래의 의미를 없애고 문자 그대로를 의미하게 하는 과정입니다. 예를 들어, HTML에서 '<'와 '>'는 태그를 의미하지만, 이를 문자 그대로 표현하고 싶을 때는 이스케이핑을 사용합니다. 자바나 스프링 부트에서는 Apache Commons Lang 라이브러리의 "StringEscapeUtils" 클래스를 통해 이스케이핑을 수행할 수 있습니다.

java
String result = StringEscapeUtils.escapeHtml3("<Hello>");


위의 코드는 "<Hello>"라는 문자열에서 '<'와 '>'를 이스케이핑하여 HTML에서 안전하게 사용할 수 있도록 합니다. encoding_escaping 위 그림은 인코딩과 이스케이핑을 설명한 예입니다. 원본 문자열에서 특정 문자를 인코딩하거나 이스케이핑하여 변환된 문자열을 생성하는 과정을 보여줍니다.
위와 같이 인코딩과 이스케이핑은 원본 데이터를 안전하게 변환하거나 표현하는 데 필요한 중요한 과정입니다. 따라서 이 두 과정을 이해하고 적절히 활용하는 것은 개발자에게 중요한 능력 중 하나입니다.

 

 

 

[java 자바공부] JPA 추상화란?

 

JPA(Java Persistence API)에서 추상화는 데이터베이스의 구체적인 기술 및 구현 방법을 숨기고, 개발자가 객체 지향적인 코드를 쉽게 작성할 수 있도록 도와주는 개념입니다.

즉, JPA는 SQL 쿼리를 직접 작성하지 않고도 데이터베이스와의 상호작용을 가능하게 하는 API를 제공합니다. 

이로 인해 개발자는 데이터베이스와 상호 작용하는 데 필요한 복잡한 쿼리를 작성하는 대신, 객체 지향 프로그래밍에 더 집중할 수 있습니다.

예를 들어, JPA의 EntityManager는 데이터베이스와의 CRUD(Create, Read, Update, Delete) 연산을 추상화합니다.

java
// Create
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(newEntity);
em.getTransaction().commit();

// Read
Entity entity = em.find(Entity.class, id);

// Update
entity.setField(newValue);
em.getTransaction().begin();
em.merge(entity);
em.getTransaction().commit();

// Delete
em.getTransaction().begin();
em.remove(entity);
em.getTransaction().commit();


위의 코드는 JPA를 사용하여 데이터베이스에 접근하는 예제입니다. 각 메서드는 데이터베이스에 대한 특정 연산을 추상화하고 있습니다. persist()는 새로운 엔티티를 데이터베이스에 저장하고, find()는 데이터베이스에서 특정 엔티티를 검색하며, merge()는 엔티티의 변경 사항을 데이터베이스에 반영하고, remove()는 데이터베이스에서 특정 엔티티를 삭제하는 작업을 수행합니다.

jpa_abstraction

이 그림은 JPA가 데이터베이스와의 상호작용을 어떻게 추상화하는지를 보여줍니다. JPA는 개발자에게 공통적인 인터페이스를 제공하며, 이를 통해 다양한 데이터베이스 시스템에 동일한 방식으로 접근할 수 있습니다.

JPA 추상화의 장점은 다음과 같습니다:

데이터베이스에 대한 접근 코드를 단순화시키고, 코드의 가독성을 향상시킵니다.
데이터베이스 시스템을 변경해야 할 경우, JPA를 사용하면 애플리케이션의 코드를 거의 변경할 필요가 없습니다.
개발자는 SQL 쿼리를 작성하는 대신, 객체 지향 프로그래밍에 집중할 수 있습니다.
따라서 JPA의 추상화는 개발자가 데이터베이스와의 상호작용을 더 효과적으로 관리할 수 있게 도와줍니다.

 

 

[java 자바공부] 스프링부트에서 네이티브 쿼리란 무엇인가?

 

스프링 부트와 JPA 환경에서 "네이티브 쿼리(Native Query)"는 SQL 쿼리를 직접 작성해서 사용하는 방식을 의미합니다. '네이티브'라는 말은 '원래의' 또는 '기본적인'이라는 뜻을 가지고 있으며, 여기에서는 데이터베이스의 기본 언어인 SQL을 직접 사용한다는 의미로 쓰입니다.

JPA는 JPQL(Java Persistence Query Language)라는 자체 쿼리 언어를 제공합니다. JPQL은 데이터베이스 테이블이 아닌 엔티티 객체를 대상으로 쿼리를 작성하는데, 이로 인해 데이터베이스 종류에 상관없이 동일한 쿼리를 사용할 수 있습니다. 하지만 JPQL로 표현하기 어려운 복잡한 쿼리나, 특정 데이터베이스에 최적화된 쿼리를 작성하려면 네이티브 쿼리를 사용해야 합니다.

스프링 데이터 JPA에서는 @Query 어노테이션을 이용해 네이티브 쿼리를 작성할 수 있습니다.

java
@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    @Query(value = "SELECT * FROM Users WHERE name = ?1", nativeQuery = true)
    User findByName(String name);

}


위의 코드는 "name"이라는 이름을 가진 사용자를 찾는 네이티브 쿼리를 작성한 예입니다. @Query 어노테이션의 value에 SQL 쿼리를 직접 작성하고, nativeQuery 속성을 true로 설정함으로써 네이티브 쿼리를 사용하겠다는 것을 명시했습니다.

 

 

[java 자바공부] 스프링부트에서 REsultSet 이란?

 

스프링 부트에서는 일반적으로 JPA나 MyBatis와 같은 ORM(Object-Relational Mapping) 도구를 사용하여 데이터베이스와의 상호작용을 처리합니다. 하지만 때때로 JDBC(Java Database Connectivity) API를 직접 사용해야 하는 경우도 있습니다. 이때 결과 집합을 다루는 데 사용하는 객체가 바로 ResultSet입니다.

ResultSet은 SQL 쿼리의 결과를 담는 객체입니다. ResultSet 객체는 쿼리를 실행한 후 반환되며, 결과 집합의 데이터를 반복적으로 읽는 데 사용됩니다.

아래는 스프링 부트에서 JDBC를 사용하여 ResultSet을 처리하는 간단한 예제입니다.

java
@Autowired
private JdbcTemplate jdbcTemplate;

public List<String> getNames() {
    String sql = "SELECT name FROM Users";

    return jdbcTemplate.query(sql, new RowMapper<String>() {
        @Override
        public String mapRow(ResultSet rs, int rowNum) throws SQLException {
            return rs.getString("name");
        }
    });
}

 


위의 코드에서는 JdbcTemplate의 query 메소드를 사용하여 SQL 쿼리를 실행하고, 그 결과를 받아와 ResultSet을 처리합니다. query 메소드의 두 번째 인자로 전달된 RowMapper 인터페이스의 구현체는 ResultSet의 각 행을 어떻게 처리할지를 정의합니다.

ResultSet

위 그림은 ResultSet이 SQL 쿼리 결과를 어떻게 담고 있는지를 나타냅니다. ResultSet 객체는 커서를 사용하여 결과 집합을 한 행씩 순회합니다. next 메소드를 호출하여 커서를 다음 행으로 이동시키고, get 메소드를 사용하여 현재 행의 특정 열의 값을 가져옵니다.

참고로 스프링 부트에서는 가능한 한 JPA나 MyBatis 같은 ORM 도구를 사용하는 것이 권장됩니다. 이러한 도구들은 SQL 쿼리를 작성하는 번거로움을 줄여주며, SQL 쿼리의 결과를 자동으로 도메인 객체로 매핑해주는 기능을 제공하므로, 개발자는 비즈니스 로직에 더 집중할 수 있습니다.

 

 

 

 









 

 

 

 

댓글