Creating a full Java application that connects to a PostgreSQL database and performs CRUD operations on a "person" table is beyond the scope of this platform. However, I can provide you with an outline and code snippets for creating such an application.

1. First, add the PostgreSQL JDBC driver to your project's dependencies. If you're using Maven, add the following dependency to your `pom.xml` file:

```xml
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.23</version>
</dependency>
```

2. Create a class called `DatabaseConnection` that establishes a connection to the PostgreSQL database:

```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnection {
    private static final String URL = "jdbc:postgresql://localhost:5432/your_database";
    private static final String USER = "your_username";
    private static final String PASSWORD = "your_password";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }
}
```

3. Create a `Person` class representing the person entity:

```java
public class Person {
    private int id;
    private String firstName;
    private String lastName;

    // Constructors, getters, and setters
}
```

4. Create a `PersonDAO` class that contains methods for performing CRUD operations on the "person" table:

```java
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class PersonDAO {
    public void create(Person person) throws SQLException {
        String sql = "INSERT INTO person (first_name, last_name) VALUES (?, ?)";

        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setString(1, person.getFirstName());
            stmt.setString(2, person.getLastName());

            stmt.executeUpdate();
        }
    }

    public List<Person> readAll() throws SQLException {
        String sql = "SELECT * FROM person";
        List<Person> persons = new ArrayList<>();

        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement stmt = conn.prepareStatement(sql);
             ResultSet rs = stmt.executeQuery()) {

            while (rs.next()) {
                Person person = new Person(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"));
                persons.add(person);
            }
        }

        return persons;
    }

    public void update(Person person) throws SQLException {
        String sql = "UPDATE person SET first_name = ?, last_name = ? WHERE id = ?";

        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setString(1, person.getFirstName());
            stmt.setString(2, person.getLastName());
            stmt.setInt(3, person.getId());

            stmt.executeUpdate();
        }
    }

    public void delete(int id) throws SQLException {
        String sql = "DELETE FROM person WHERE id = ?";

        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setInt(1, id);

            stmt.executeUpdate();
        }
    }
}
```

5. Create a `Main` class to test the CRUD operations:

```java
public class Main {
    public static void main(String[] args) {
        PersonDAO personDAO = new PersonDAO();

        // Create a new person
        Person person = new Person("John", "Doe");
        try {
            personDAO.create(person);
            System.out.println("Person created: " + person);
        } catch (SQLException e) {
            System.err.println("Error creating person: " + e.getMessage());
        }

        // Read all persons
        try {
            List<Person> persons = personDAO.readAll();
            System.out.println("Persons: " + persons);
        } catch (SQLException e) {
            System.err.println("Error reading persons: " + e.getMessage());
        }

        // Update a person
        person.setFirstName("Jane");
        person.setLastName("Doe");
        try {
            personDAO.update(person);
            System.out.println("Person updated: " + person);
        } catch (SQLException e) {
            System.err.println("Error updating person: " + e.getMessage());
        }

        // Delete a person
        try {
            personDAO.delete(person.getId());
            System.out.println("Person deleted with ID: " + person.getId());
        } catch (SQLException e) {
            System.err.println("Error deleting person: " + e.getMessage());
        }
    }
}
```

This is just a basic example of how to create a Java application that connects to a PostgreSQL database and performs CRUD operations on a "person" table. You can extend this code by adding more features, such as transactions and error handling, based on your requirements.
PostgreSQL 데이터베이스에 연결하고 "person" 테이블에 대해 CRUD 작업을 수행하는 전체 Java 애플리케이션을 만드는 것은 이 플랫폼의 범위를 벗어납니다. 하지만 이러한 애플리케이션을 만들기 위한 개요와 코드 스니펫을 제공할 수 있습니다.

1. 먼저 프로젝트의 종속성에 PostgreSQL JDBC 드라이버를 추가합니다. Maven을 사용하는 경우 `pom.xml` 파일에 다음 종속성을 추가합니다:

```xml
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.23</version>
</dependency>
```

2. PostgreSQL 데이터베이스에 대한 연결을 설정하는 'DatabaseConnection'이라는 클래스를 만듭니다:

```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnection {
    private static final String URL = "jdbc:postgresql://localhost:5432/your_database";
    private static final String USER = "your_username";
    private static final String PASSWORD = "your_password";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }
}
```

3. 사람 엔티티를 나타내는 `Person` 클래스를 생성합니다:

```java
public class Person {
    private int id;
    private String firstName;
    private String lastName;

    // Constructors, getters, and setters
}
```

4. "person" 테이블에서 CRUD 연산을 수행하는 메서드가 포함된 `PersonDAO` 클래스를 생성합니다:

```java
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class PersonDAO {
    public void create(Person person) throws SQLException {
        String sql = "INSERT INTO person (first_name, last_name) VALUES (?, ?)";

        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setString(1, person.getFirstName());
            stmt.setString(2, person.getLastName());

            stmt.executeUpdate();
        }
    }

    public List<Person> readAll() throws SQLException {
        String sql = "SELECT * FROM person";
        List<Person> persons = new ArrayList<>();

        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement stmt = conn.prepareStatement(sql);
             ResultSet rs = stmt.executeQuery()) {

            while (rs.next()) {
                Person person = new Person(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name"));
                persons.add(person);
            }
        }

        return persons;
    }

    public void update(Person person) throws SQLException {
        String sql = "UPDATE person SET first_name = ?, last_name = ? WHERE id = ?";

        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setString(1, person.getFirstName());
            stmt.setString(2, person.getLastName());
            stmt.setInt(3, person.getId());

            stmt.executeUpdate();
        }
    }

    public void delete(int id) throws SQLException {
        String sql = "DELETE FROM person WHERE id = ?";

        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setInt(1, id);

            stmt.executeUpdate();
        }
    }
}
```

5. CRUD 작업을 테스트할 `Main` 클래스를 생성합니다:

```java
public class Main {
    public static void main(String[] args) {
        PersonDAO personDAO = new PersonDAO();

        // Create a new person
        Person person = new Person("John", "Doe");
        try {
            personDAO.create(person);
            System.out.println("Person created: " + person);
        } catch (SQLException e) {
            System.err.println("Error creating person: " + e.getMessage());
        }

        // Read all persons
        try {
            List<Person> persons = personDAO.readAll();
            System.out.println("Persons: " + persons);
        } catch (SQLException e) {
            System.err.println("Error reading persons: " + e.getMessage());
        }

        // Update a person
        person.setFirstName("Jane");
        person.setLastName("Doe");
        try {
            personDAO.update(person);
            System.out.println("Person updated: " + person);
        } catch (SQLException e) {
            System.err.println("Error updating person: " + e.getMessage());
        }

        // Delete a person
        try {
            personDAO.delete(person.getId());
            System.out.println("Person deleted with ID: " + person.getId());
        } catch (SQLException e) {
            System.err.println("Error deleting person: " + e.getMessage());
        }
    }
}
```

이것은 PostgreSQL 데이터베이스에 연결하고 "person" 테이블에서 CRUD 작업을 수행하는 Java 애플리케이션을 만드는 방법의 기본 예제일 뿐입니다. 요구 사항에 따라 트랜잭션 및 오류 처리와 같은 더 많은 기능을 추가하여 이 코드를 확장할 수 있습니다.