본문 바로가기

전체 글

(133)
자바: java.util.ConcurrentModificationException 에러 자바로 작업을 하던 중 다음과 같은 에러를 만났다. Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) ... 구글 검색을 해보니 List와 같은 객체를 for each 문을 돌릴 때, 해당 객체를 수정하면 발생한다고 한다. 그리고 보통 해당상황이 발생하는 경우는 크게 두가지 경우가 있다고 한다. 싱글 스레드 환경에서 for each문 중간에 객체를 수정하는 경우 멀티 스레드 환경에서, 다른 스레드에서 객체 값이 수정된..
Azure CosmosDB 에러: java.lang.IllegalArgumentException: Id contains illegal chars. Azure CosmosDB를 활용하여 개발을 하던 중, 다음과 같은 에러가 발생하였다. java.lang.IllegalArgumentException: Id contains illegal chars. id에 들어가서는 안되는 문자열이 들어간거 같아서 확인을 해보니, id에 '#' 문자를 포함하여서 생긴 문제였다. 확인 결과 다음과 같은 문자들을 id에 사용하면 안된다. The following characters are restricted and cannot be used in the Id property: '/', '\\', '?', '#' 출처: https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.documents.resource.id?view=..
2-2) 스프링 트랜잭션 관리: ACID, Dirty Read, Repeatable Read, Pantom Read, @EnableTransactionManagement, @Transactional, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE - 데이터베이스 트랜잭션 데이터베이스 트랙잭션이란, 데이터관리 시스템에서 사용되는 업무처리 단위를 말한다. 은행에는 송금이라는 기본적인 기능이 있다. 송금은 내부적으로 출금 계좌에서 돈을 꺼내는 과정과, 입금 계좌에 돈을 넣는 과정으로 나누어 볼 수 있다. 여기서 두개의 과정중 일부만 실패하거나 성공하는 경우는 일어나서는 안된다. 이처럼 트랜잭션은 지켜져야하는 조건이 있는데 이를 ACID라고 부른다. - RDB의 특징: ACID 최근 NoSQL과 같은 새로운 형태의 DB가 인기를 끌고 있긴 하지만, 여전히 대다수의 서비스에서는 관계형 데이터베이스(Relational Database), RDB를 사용한다. RDB는 키와 값들의 간단한 관계를 테이블화 시킨 데이터베이스이다. 그리고 RDB에서 지켜져야하는 다..
Selenium과 Ec2를 활용한 트위치 뷰봇(Twitch Viewbot) 만들기 1. 셀레니움이란? 셀레니움(Selenium)이란 웹 응용 프로그램 테스트를 위한 휴대용 프레임 워크. 익스플로러, 크롬, 파이어 폭스 등 다양한 웹 브라우저로 웹사이트를 동작시키고 테스트 하기 위해 만들어진 도구이다. 하지만 브라우저를 자동으로 동작시키고 그 내용을 얻을 수 있다는 점에서 크롤링에도 사용되고 있다. 2. 셀레니움 실습 2-1) 실습 사전 준비 셀레니움은 Java로 만들어 졌지만 java뿐 아니라 python, ruby등 다양한 언어로 사용할 수 있다. 본 실습에서는 빠른 진행을 위해 python을 사용하겠다. https://www.anaconda.com/distribution/#download-section 에서 파이썬을 설치하면 파이썬 뿐 아니라, 자주 사용하는 다양한 패키지 까지 함..
2-1) 스프링 JDBC: DataSource, H2, SimpleJdbcInsert, NamedParameterJdbcTemplate, BeanPropertyRowMapper, BeanPropertySqlParameterSource - JAVA에서의 DB 접근: JDBC 거의 모든 서비스는 데이터를 기반으로 이루어진다. 따라서 DB에 접근하는 동작이 자주 수행되는데, JAVA에서는 이를 위해 JDBC가 존재한다. JDBC는 JAVA에서 각 데이터베이스에 접근하기위한 인터페이스이다. 실제 코드를 보면 다음과 같이 DB에 접근하여 데이터를 가져올 수 있다. Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try { // 1. Connection을 가져오고 conn = dataSource.getConnection(); // 2. 쿼리를 실행할 준비를하고 stmt = conn.prepareStatement("SELECT * FROM Noun001"); ..
1-8) 스프링 리소스(Resource): Resource, ResourceLoader - 스프링 리소스: Resource 추상 클래스 서비스를 개발하다 보면 리소스 파일에 접근할 일이 종종 있다. 설정 정보를 불러오기위해 resources 폴더의 .properties 파일에 접근하기도 하고, 외부 사이트의 이미지 파일을 불러오기도 한다. 스프링에는 리소스에 접근하기 위한 추상클래스 Resource가 존재하고, 각 상황별로 쓸 수 있는 구현 클래스가 존재한다. - 스프링 리소스 편하게 가져오기: ResourceLoader 개발자 입장에서는 상황에 맞는 Resource 구현 클래스를 사용해야 한다는 것 자체가 부담으로 다가올 수 도 있다. 그래서 스프링에서는 ResourceLoader가 존재한다. ResourceLoader는 리소스의 경로를 보고 적절한 Resource 구현 클래스를 사용하고..
1-7) 스프링 프로파일(Profile): @Profile - 스프링 프로파일(Profile) 상용 서비스를 출시하면, 서비스가 운영되고있는 운영 서버와 추가 개발을 위한 개발 서버를 분리하는 것이 보통이다. 개발을 하다보면 새로운 버그가 생길 수 있고, 자주 소스를 새로 배포해야하는 상황이 생기기 때문이다. 따라서 코드 또한 개발서버에서 동작해야하는 코드와, 운영서버에서 동작해야하는 코드가 분기될 수 있다. @Configuration public class DBConfig { ... // 개발 서버용 dataSource // @Bean // public DataSource dataSourceForDev() { // return new EmbeddedDatabaseBuilder() // .setType(EmbeddedDatabaseType.H2) // .setS..
1-6) 스프링 프로퍼티(Property): @PropertySource, @Value, Environment - 스프링 프로퍼티(Property) 소스 코드를 작성하다 보면, 정적으로 하드코딩된 내용을 쓸때가 있다. 대표적으로 DB의 설정정보가 그렇다. 그래서 DB 설정 정보 클래스를 보면 다음과 같이 코딩되어있다. @Configuration @Import(value = {DBConfig.class}) public class AppConfig { ... } @Configuration public class DBConfig { private String driver = "DB 접속 드라이버"; private String url = "DB 접속 URL"; private String username = "DB 접속 유저명"; private String password = "DB 접속 패스워드"; ... @Overri..