Spring

Web/Spring

[Spring] @Resource 와 @Autowired 차이

@Resource 어노테이션과 @Autowired 어노테이션의 차이 두 어노테이션 모두 의존성을 주입하는 어노테이션이다. 해당 어노테이션을 사용하여 IoC 컨테이너에 등록된 빈 객체를 자동으로 주입한다. @Autowired 어노테이션에 대한 자세한 설명은 검색하면 많은 정보가 나오므로 생략하도록 한다. @Resource 어노테이션과 어떤 차이가 존재하는지를 중점적으로 살펴본다. 편의상 해당 글에서 모든 의존성 주입 방법 예시는 필드 주입으로 한다. @Autowired - 필드, 메서드, 생성자에 사용할 수 있다. - Bean의 타입을 사용해서 주입할 빈 객체를 찾는다. - 하나의 인터페이스는 한 개의 클래스로만 구현할 수 있다. (두 개 이상의 클래스가 구현하면 안 된다.) 마지막 특징 때문에 @Reso..

Web/Spring

[Spring Boot] pdf 파일 다운로드 및 현재 탭에서 열기

pdf 파일 다운로드 및 현재 탭에서 열기 스프링에서 파일 다운로드 구현은 어렵지 않다. 다운로드 파일 유형이 pdf인 경우, 다운로드하지 않고 현재 탭에 미리보기로 띄워야 하는 경우도 있는데, 이도 어렵지 않다. 파일 다운로드 간단하게 ResourceLoader를 사용하여 파일 다운로드하는 방법을 알아본다. html 부분이다. 파일 다운로드 태그를 작성하고, 해당 태그 클릭 시 파일 다운로드를 진행하게 한다. myFile.pdf 부분은 파일명을 집어넣는다. 데이터 정보로 파일명을 불러올 수도 있지만 현재 예제에서는 정말 단순하게 파일 다운로드만 살펴볼 것이기 때문에 파일명을 myFile.pdf로 지정해주었다. 다음은 Controller 부분이다. 기존 Controller를 사용해도 되긴 하지만 파일 기..

Web/Thymeleaf

[Thymeleaf] location.href에 변수 넣기 (th:onclick, GET)

location.href에 타임 리프 변수 넣기 타임리프에서 GET 방식으로 필요한 파라미터를 집어넣을 때, 태그의 th:href에서는 무리 없이 값이 들어갔지만 th:onclick에서 location.href 사용 시에는 th:href처럼 동작하지 않았다. 그래서 조금 다르게 작성하였다. 쉬운 이해를 위해 두 가지 코드를 비교해본다. th:href View page url임을 명시할 때는 @{}를 사용한다. GET 방식으로 데이터를 전달하려면 @{} 안에 (key=value)를 넣어준다. 위 코드를 예시로 하였을 때 view는 이동할 페이지이고, uid는 key이며 ${data.uid}가 value이다. 만약 ${data.uid}에 들어가는 값이 1이라고 가정하고 위 태그를 클릭했을 때 url은 아래와..

Programing

좋은 객체 지향 프로그래밍 (With. 스프링)

객체 지향 프로그래밍 객체(Object)들의 모임이 서로 협력하는 것이 객체 지향 프로그래밍이다. 이때 메시지를 사용하여 객체끼리 협력한다. 객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고, 다른 것과 식별 가능한 것을 말한다. 나는 첫 프로그래밍을 C언어로 접했기 때문에 객체 지향의 장점을 절차 지향과 비교해 예시를 들 때 이해가 잘 됐다. 어떤 프로그램이 절차 지향 방식으로 짜였다면 프로그램에 어떠한 기능을 제외하려고 할 때 그 기능과 관련된 앞뒤 코드를 살펴보고, 삭제할 기능과 연결된 부분을 수정해야 한다(이는 물론 객체 지향에서도 마찬가지이긴 하다). 그러나 절치 지향과 객체 지향은 수정해야 할 코드의 범위가 다르다. 객체 지향 방식으로 (잘) 설계했다..

Web/Spring

[Spring] 의존성 주입 (Dependency Injection, DI) 예제

의존성 주입 (Dependency Injection, DI) MVC 모델을 사용하여 개발한다고 가정할 때 Controller에서는 Service에 있는 메서드를 호출해야 하고, Service에서는 Repository(or DAO,...)에 있는 메서드를 호출해야 한다. 이런 상황에서 Controller에서는 Service에 의존한다 말하고, Service는 Repository에 의존한다고 얘기한다. interface MemberRepository {...} public class JdbcMemberRepository implements MemberRepository {...} public class MyBatisMemberRepository implements MemberRepository {...} p..

Web/Spring

[Spring] JDBC, JDBC Template 예제

Spring JDBC, JDBC Template 예제 요즘에는 보통 MyBatis나 JPA를 이용해서 개발하지만 옛날에는 JDBC로 개발했던 적이 있었다. JDBC는 JSP로 웹 개발할 때 사용해서 익숙하지만 JDBC Template는 처음 보는 것이어서 두 개의 예제를 비교해본다. JDBC import hello.hellospring.domain.Member; import org.springframework.jdbc.datasource.DataSourceUtils; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql..

Web/Spring

[Spring] 스프링 빈을 등록하는 두 가지 방법

Spring Bean(스프링 빈) 스프링 IoC 컨테이너(객체를 생성하고 관리하며 객체끼리의 의존관계를 연결함)가 관리하는 객체들을 Bean이라고 부른다. 스프링 컨테이너에 등록된 객체를 스프링 빈이라 하는 것이다. 본 글에서는 스프링 IoC 컨테이너를 편의상 스프링 컨테이너라고 작성한다. 이때 스프링 컨테이너가 관리하는 객체는 우리가 평상시 new 연산자로 생성하는 객체가 아닌, ApplicationContext.getBean()으로 얻어질 수 있는 객체이다. new 연산자로 생성한 객체는 사용자가 직접 생성한 객체이므로 스프링 컨테이너에서 관리되지 않는다. 스프링 컨테이너에서 관리하는 객체는 ApplicationContext가 생성한 객체이다. 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 (따로..

Web/Spring

[Spring Boot] @AfterEach, @BeforeEach 예제

Test case 작성 스프링 부트에서는 테스트 메서드 작성 시 메서드 앞에 @Test 어노테이션을 명시한다. 각각의 테스트 메서드는 독립적으로 실행되어야 한다. 테스트는 각 테스트끼리의 순서가 관계없어야 하고, 의존 관계가 없어야 한다. 따라서 하나의 테스트가 끝날 때마다 공용 데이터들을 깔끔하게 지워야 한다. 이를 위해 @BeforeEach와 @AfterEach 어노테이션을 사용한다. 테스트 메서드 작성 시 메서드 명은 한글로 작성해도 상관없다. 빌드 시 실제 코드에 포함되지 않기 때문이다. @SpringBootTest 스프링 부트를 사용해 Test 한다는 것을 명시한다. 데이터베이스 정보를 스프링에서 가지고 있을 때 사용한다. 해당 어노테이션이 붙으면 스프링 컨테이너와 테스트를 함께 실행한다. @T..

Web/Spring

@ResponseBody 작동 원리

@ResponseBody 작동 원리 @ResponseBody 어노테이션을 사용하지 않는 메서드와 @ResponseBody 어노테이션을 사용하는 두 개의 메서드를 비교하여 살펴본다. @ResponseBody 어노테이션을 사용하여 페이지에 데이터만을 전달할 수 있다. @RepsonseBody 사용 안 함 첫 번째로는 @RepsonseBody를 사용하지 않는 일반적인 메서드이다. 스프링 부트의 경우 웹 브라우저에서 (ex) localhost:8080/mvc를 통해 사이트에 접속하면 내장 톰캣 서버에서 mvc를 스프링에 넘겨주고, 스프링에서는 컨트롤러에 있는 Mapping을 따라 찾아간다. Mapping 된다면 ViewResolver로 토스되어(View를 통해서) 처리된다. @GetMapping("mvc") p..

Programing/Errors

[MyBatis] Cause: java.lang.NumberFormatException: For input string: "Y"

java.lang.NumberFormatException: For input string: "Y" There was an unexpected error (type=Internal Server Error, status=500). nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.lang.NumberFormatException: For input string: "Y" ### Cause: java.lang.NumberFormatException: For input string: "Y" MyBatis에서 if문 사용 중 위와 유사한 에러가 발생하는 경우가 있다. ..

Setting

[Eclipse] properties 파일 한글 깨지는 경우

이클립스에서 properties 파일 한글 깨질 때 workspace 인코딩을 UTF-8로 하여도 properties 파일은 한글이 깨지는 경우가 있습니다. 확장자명이 properties 인 파일도 따로 인코딩 설정을 해주어야 깨지지 않습니다. 상단 메뉴의 Window > Perferences를 클릭합니다. 검색 창에 enc를 검색하면 위와 같은 화면이 나옵니다. Content types: 에서 마지막에서 두 번째인 Text 왼쪽 > 표시를 눌러 모든 확장자명이 보이게 합니다. Java Properties File을 클릭하면 Default encoding 값이 ISO-8859-1로 되어있습니다. Default encoding 값을 UTF-8로 변경하면 오른쪽 Update 버튼이 활성화됩니다. Update..

Programing/Errors

[MyBatis] Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다

Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다 ; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다 ] with root cause oracle.jdbc.OracleDatabaseException: ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다 MyBatis에서 쿼리문 작성 시, 쿼리문 마지막에 세미콜론(;)을 붙이면 위와 같은 오류가 발생한다. 에러 파일 경로는 쿼리문에 담겨있는 .xml 파일 경로로 뜰 것이다. 쿼리문을 아래와 같이 작성하였기 때문에..